Compare commits
No commits in common. "master" and "experimental" have entirely different histories.
master
...
experiment
|
@ -20,7 +20,7 @@ Using the DLPI support on SysV systems to get the host MAC address in check_dhcp
|
|||
Stenberg, Daniel
|
||||
Copyright (c) 1996 - 2004, Daniel Stenberg, <daniel@haxx.se>
|
||||
http://curl.haxx.se/
|
||||
Use of duplication of macros in m4/np_curl.m4 (slightly adapted for m4/uriparser.m4 too)
|
||||
Use of duplication of macros in m4/np_curl.m4 (slighly adapted for m4/uriparser.m4 too)
|
||||
|
||||
Coreutils team
|
||||
Copyright (C) 91, 1995-2004 Free Software Foundation, Inc.
|
||||
|
|
6
INSTALL
6
INSTALL
|
@ -1,8 +1,8 @@
|
|||
Installation Instructions
|
||||
*************************
|
||||
|
||||
Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software
|
||||
Foundation, Inc.
|
||||
Copyright (C) 1994-1996, 1999-2002, 2004-2017, 2020-2021 Free
|
||||
Software Foundation, Inc.
|
||||
|
||||
Copying and distribution of this file, with or without modification,
|
||||
are permitted in any medium without royalty provided the copyright
|
||||
|
@ -225,7 +225,7 @@ order to use an ANSI C compiler:
|
|||
|
||||
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
|
||||
|
||||
HP-UX 'make' updates targets which have the same time stamps as their
|
||||
HP-UX 'make' updates targets which have the same timestamps as their
|
||||
prerequisites, which makes it generally unusable when shipped generated
|
||||
files such as 'configure' are involved. Use GNU 'make' instead.
|
||||
|
||||
|
|
1124
Makefile.in
1124
Makefile.in
File diff suppressed because it is too large
Load diff
68
NEWS
68
NEWS
|
@ -1,43 +1,5 @@
|
|||
This file documents the major additions and syntax changes between releases.
|
||||
|
||||
2.3.5 18th Oct 2023
|
||||
FIXES
|
||||
* Include maxfd.h in lib Makefile
|
||||
|
||||
2.3.4 18th Oct 2023
|
||||
ENHANCEMENTS
|
||||
* check_curl: added --cookie-jar and doing proper cleanup of libcurl
|
||||
* check_curl: Include all IPs from getaddrinfo() in curl DNS cache
|
||||
* check_dhcp: Add dhcp rogue detection
|
||||
* check_disk: add ignore-missing option to return OK for missing fs
|
||||
* check_disk_smb: allow checking 0-sized resource (ex. IPC$)
|
||||
* check_disk: The options to include or exclude specific file systems now allow the usage of regex(7)
|
||||
* check_icmp: Add support to Jitter, MOS and Score
|
||||
* check_mysql: Detect running mysqldump and handle it more gracefully
|
||||
* check_procs: Implement --exclude-process to exclude specific processes
|
||||
* check_smtp: add new longoption --tls
|
||||
* check_smtp: Add option to prefix PROXY header
|
||||
* check_smtp: Add support for SMTP over TLS
|
||||
* check_smtp: Add support for SNI
|
||||
* check_snmp: Implement option to ignore mib file parsing errors
|
||||
* check_users: prefer systemd-logind over utmp
|
||||
|
||||
FIXES
|
||||
* check_disk: Display SI units correctly
|
||||
* check_ircd: use pack_sockaddr_in rather than hand-rolled
|
||||
* check_log/check_oracle/check_sensors: fixed the outputs of the help functionality
|
||||
* check_mysql: Add mysql_close to avoid spamming the server logs
|
||||
* check_smtp: add missing -r option in usage
|
||||
* check_snmp: disable multiplier when unused
|
||||
* check_wave: Use compile time determined path to snmpget
|
||||
|
||||
GENERAL
|
||||
* Sync with the Gnulib code 668c0b8ffa
|
||||
* Set autoconf prerequisite version to 2.64
|
||||
* Remove sha1 and use sha256 in some parts of the plugin structure
|
||||
* A lot of compiler warnings were fixed
|
||||
* Some code was refactored a little bit
|
||||
|
||||
2.3.3 2nd Feb 2023
|
||||
ENHANCEMENTS
|
||||
using PRId64 and PRIu64 instead of %ld directly
|
||||
|
@ -47,12 +9,12 @@ This file documents the major additions and syntax changes between releases.
|
|||
check_http/check_curl: add chunked encoding test
|
||||
check_log: Added --exclude to exclude patterns
|
||||
check_log: Add tests
|
||||
check_disk: Clarify usage possibilities
|
||||
check_disk: Clarify usage possibilites
|
||||
|
||||
FIXES
|
||||
fixed two PRId64 to PRIu64 in perfdata_uint64
|
||||
check_pgsql: Removing is_pg_dbname altogether,using postgres API.
|
||||
check_http: Remove superfluous CRLF in HTTP-Requests
|
||||
check_pgsql: Removing is_pg_dbname alltogether,using postgres API.
|
||||
check_http: Remove superflous CRLF in HTTP-Requests
|
||||
check_curl: detect ipv6
|
||||
check_icmp: fix parsing help/version long options
|
||||
check_http: fix test plan
|
||||
|
@ -78,7 +40,7 @@ This file documents the major additions and syntax changes between releases.
|
|||
|
||||
2.3.2 20th Oct 2022
|
||||
GENERAL
|
||||
Use netcat-openbsd for debian explicitly (by @RincewindsHat #1704)
|
||||
Use netcat-openbsd for debian explicitely (by @RincewindsHat #1704)
|
||||
Replace egrep with grep -E (by @RincewindsHat #1791)
|
||||
Use silent automake by default (by @RincewindsHat #1747)
|
||||
|
||||
|
@ -161,7 +123,7 @@ This file documents the major additions and syntax changes between releases.
|
|||
check_log: Modernize check log (by @RincewindsHat #1692)
|
||||
check_mailq: remove duplicate W=i/C=i args in check_mailq.pl (by @ichdasich #1755)
|
||||
check_ntp: Check ntp remove unused variables (by @RincewindsHat #1781)
|
||||
check_pgsql: Using snprintf which honors the buffers size and guarantees null termination. (Closes: #1601) (by @waja #1663)
|
||||
check_pgsql: Using snprintf which honors the buffers size and guarantees null temination. (Closes: #1601) (by @waja #1663)
|
||||
check_procs: Fix double percentage sign in usage (by @RincewindsHat #1743)
|
||||
check_sensors.sh: Make shellcheck happier (by @RincewindsHat #1679)
|
||||
check_snmp: Fixed option description authpassword -> authpasswd + whitespaces (by @RincewindsHat #1676)
|
||||
|
@ -203,7 +165,7 @@ This file documents the major additions and syntax changes between releases.
|
|||
check_apt: adding packages-warning option
|
||||
check_load: Adding top consuming processes option
|
||||
check_http: Adding Proxy-Authorization and extra headers
|
||||
check_snmp: make calculation of timeout value in help output more clear
|
||||
check_snmp: make calcualtion of timeout value in help output more clear
|
||||
check_uptime: new plugin for checking uptime to see how long the system is running
|
||||
check_curl: check_http replacement based on libcurl
|
||||
check_http: Allow user to specify HTTP method after proxy CONNECT
|
||||
|
@ -233,7 +195,7 @@ This file documents the major additions and syntax changes between releases.
|
|||
check_procs: improve command examples for 'at least' processes
|
||||
check_swap: repaired "-n" behaviour
|
||||
check_disk: include -P switch in help
|
||||
check_mailq: restore accidentally removed options
|
||||
check_mailq: restore accidentially removed options
|
||||
|
||||
2.2 29th November 2016
|
||||
ENHANCEMENTS
|
||||
|
@ -274,7 +236,7 @@ This file documents the major additions and syntax changes between releases.
|
|||
check_ssh now returns CRITICAL for protocol/version errors
|
||||
If a plugin is invoked with -h/--help or -V/--version, the exit status
|
||||
is now UNKNOWN
|
||||
The superseded check_ntp.pl was removed, please use check_ntp_peer or
|
||||
The superseeded check_ntp.pl was removed, please use check_ntp_peer or
|
||||
check_ntp_time instead
|
||||
|
||||
2.1.2 16th October 2015
|
||||
|
@ -301,7 +263,7 @@ This file documents the major additions and syntax changes between releases.
|
|||
New check_mysql -n option to ignore authentication failures
|
||||
Added IP and port or socket name to error messages
|
||||
New check_ntp_time -o option to add expected offset
|
||||
check_disk shows now troubled partitions in verbose mode
|
||||
check_disk shows now troubled partions in verbose mode
|
||||
check_dig has now support for drill and dig
|
||||
check_dig has now support for -6 option
|
||||
Add performance data to check_file_age
|
||||
|
@ -395,10 +357,10 @@ This file documents the major additions and syntax changes between releases.
|
|||
New check_procs -k option to ignore kernel threads (on Linux)
|
||||
Let check_procs use /proc/<PID>/exe (if available) instead of getpid(2), unless -T is specified
|
||||
Let check_mysql support SSL
|
||||
Let check_mysql add performance metrics for all checks
|
||||
Let check_mysql add perfromance metrics for all checks
|
||||
New check_mysql -f option to specify a client options file
|
||||
New check_mysql -g option to specify a client options group
|
||||
New check_snmp --offset option to allow for adding/subtracting an offset value to sensor data
|
||||
New check_snmp --offset option to allow for adding/substracting an offset value to sensor data
|
||||
Let check_snmp support an arbitrary number of OIDs
|
||||
Let check_ide_smart support NetBSD
|
||||
|
||||
|
@ -413,7 +375,7 @@ This file documents the major additions and syntax changes between releases.
|
|||
Fix deprecated imports of check_nmap.py
|
||||
|
||||
WARNINGS
|
||||
check_http behaviour of -k/--header changed since it does not separate multiple headers by semicolons anymore. Use multiple -k switches instead.
|
||||
check_http behaviour of -k/--header changed since it does not seperate multiple headers by semicolons anymore. Use multiple -k switches instead.
|
||||
check_http's --proxy_authorization option is now called --proxy-authorization (it was always documented this way)
|
||||
The contrib directory has been removed from this distribution
|
||||
|
||||
|
@ -564,7 +526,7 @@ This file documents the major additions and syntax changes between releases.
|
|||
check_ntp and check_ntp_peer now show proper jitter/stratum thresholds longopts in --help
|
||||
check_dns now allow to repeat -a to match multiple possibly returned address (common with load balancers)
|
||||
check_mysql and check_radius now try clearing password in processlist just like check_mysql_query
|
||||
check_mysql and check_mysql_query now support sockets explicitly (-s, --socket)
|
||||
check_mysql and check_mysql_query now support sockets explicitely (-s, --socket)
|
||||
negate now has the ability to replace the status text as well (-s, --substitute)
|
||||
Added performance data to check_ping
|
||||
Added support for --extra-opts in all C plugins (disabled by default, see configure --help)
|
||||
|
@ -604,7 +566,7 @@ This file documents the major additions and syntax changes between releases.
|
|||
New check_disk option -L: Only check local filesystems, but call stat() on remote ones, too.
|
||||
Thus accessibility of remote filesystems can be checked without any threshold comparison.
|
||||
Check_disk's --help now prints some examples for the new features introduced in 1.4.8
|
||||
New check_disk -i/-I option to ignore paths/partitions based on regular expressions
|
||||
New check_disk -i/-I option to ignore pathes/partitions based on regular expressions
|
||||
New check_disk -A option to select all filesystems explicitly
|
||||
WARNING: check_disk's -E option must now be passed before -p or -r/-R arguments
|
||||
Passing -E after -p or -r results in UNKNOWN state, now
|
||||
|
@ -653,7 +615,7 @@ This file documents the major additions and syntax changes between releases.
|
|||
Fixed MKINSTALLDIRS problem in po/
|
||||
./configure now detects if possible to compile check_mysql
|
||||
Fixed broken HELO in check_smtp
|
||||
check_icmp now allows to set a minimum number of hosts required for success (-m)
|
||||
check_icmp now allows to set a minimum number of hosts required for successs (-m)
|
||||
check_icmp fix for *BSD when running for long time
|
||||
check_ping times out 1 second quicker if host is unreachable
|
||||
Root plugins installed with world executable
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
SRC_ROOT=`dirname $0`
|
||||
|
||||
NPVF=NP-VERSION-FILE
|
||||
DEF_VER=2.3.5
|
||||
DEF_VER=2.3.3
|
||||
|
||||
LF='
|
||||
'
|
||||
|
|
|
@ -151,14 +151,14 @@ of testing against a set of desired exit status values.
|
|||
=item *
|
||||
|
||||
Firstly, if C<$desiredExitStatus> is a reference to an array of exit
|
||||
statuses, if the actual exit status of the command is present in the
|
||||
stati, if the actual exit status of the command is present in the
|
||||
array, it is used in the call to C<Test::ok(...)> when testing the
|
||||
exit status.
|
||||
|
||||
=item *
|
||||
|
||||
Alternatively, if C<$desiredExitStatus> is a reference to a hash of
|
||||
exit statuses(mapped to the strings "continue" or "skip"), similar
|
||||
exit stati (mapped to the strings "continue" or "skip"), similar
|
||||
processing to the above occurs with the side affect of determining if
|
||||
any generated output testing should proceed. Note: only the string
|
||||
"skip" will result in generated output testing being skipped.
|
||||
|
@ -207,7 +207,7 @@ under the same terms as the Monitoring Plugins release.
|
|||
|
||||
my( %CACHE ) = ();
|
||||
|
||||
# I'm not really sure whether to house a site-specific cache inside
|
||||
# I'm not really sure wether to house a site-specific cache inside
|
||||
# or outside of the extracted source / build tree - lets default to outside
|
||||
my( $CACHEFILENAME ) = ( exists( $ENV{'NPTEST_CACHE'} ) && $ENV{'NPTEST_CACHE'} )
|
||||
? $ENV{'NPTEST_CACHE'} : "/var/tmp/NPTest.cache"; # "../Cache.pdd";
|
||||
|
|
42
THANKS
42
THANKS
|
@ -2,25 +2,22 @@ This software is brought to you by the Monitoring Plugins Development Team. Howe
|
|||
there have been many contributors to this project. Everyone below has helped in
|
||||
raising bug reports, creating patches or contributing new plugins.
|
||||
|
||||
Arkadiusz Miśkiewicz
|
||||
dag rob?le
|
||||
Matthias Döhler
|
||||
Marc Sánchez
|
||||
Wolfgang Karall-Ahlborn
|
||||
Thoralf Rickert-Wendt
|
||||
Diego Elio Pettenò
|
||||
Nicolai Søborg
|
||||
Elan Ruusamäe
|
||||
Matthias Hähnel
|
||||
fabiodds
|
||||
Aksel Sjögren
|
||||
Randy O'Meara
|
||||
Wolfgang Karall-Ahlborn
|
||||
Nicolai Søborg
|
||||
dag rob?le
|
||||
Diego Elio Pettenò
|
||||
Matthias Hähnel
|
||||
Marc Sánchez
|
||||
Aksel Sjögren
|
||||
fabiodds
|
||||
Oskar Ahner
|
||||
Lance Albertson
|
||||
David Alden
|
||||
Patrick Allen
|
||||
Paul Allen
|
||||
Rodger Allen
|
||||
Paul Allen
|
||||
Felipe Gustavo de Almeida
|
||||
Michael Almond
|
||||
Michael Anthon
|
||||
|
@ -47,7 +44,6 @@ Hilko Bengen
|
|||
Jason Benguerel
|
||||
Allan Bennett
|
||||
Booker C. Bense
|
||||
Björn Berg
|
||||
Guy Van Den Bergh
|
||||
Andrew Berglund
|
||||
Jimmy Bergman
|
||||
|
@ -79,7 +75,6 @@ Jethro Carr
|
|||
Jim Carroll
|
||||
Ian Cass
|
||||
Arnold Cavazos
|
||||
Patrick Cervicek
|
||||
Alex Chaffee
|
||||
Yannick Charton
|
||||
Stephane Chazelas
|
||||
|
@ -89,9 +84,9 @@ Lee Clemens
|
|||
Ben Clewett
|
||||
Jean-Claude Computing
|
||||
Lionel Cons
|
||||
Ollie Cook
|
||||
Garry Cook
|
||||
Charlie Cook
|
||||
Ollie Cook
|
||||
Luca Corti
|
||||
Greg Cox
|
||||
Jason Crawford
|
||||
|
@ -149,8 +144,8 @@ Tim Gates
|
|||
Sven Geggus
|
||||
Jonas Genannt
|
||||
Robby Giffin
|
||||
Flo Gleixner
|
||||
Florian Gleixner
|
||||
Flo Gleixner
|
||||
Evgeni Golov
|
||||
Joseph Gooch
|
||||
Aravind Gottipati
|
||||
|
@ -172,7 +167,6 @@ Sebastian Harl
|
|||
Michael Haro
|
||||
Olli Hauer
|
||||
Gunnar Hellekson
|
||||
Stuart Henderson
|
||||
Geert Hendrickx
|
||||
Sebastian Herbszt
|
||||
Johannes Herlitz
|
||||
|
@ -215,7 +209,6 @@ Frederic Krueger
|
|||
Claudio Kuenzler
|
||||
Marcel Kuiper
|
||||
Christian Kujau
|
||||
Thorsten Kukuk
|
||||
Alexander Kulak
|
||||
Bill Kunkel
|
||||
Thomas Kurschel
|
||||
|
@ -243,12 +236,11 @@ Jason Lunn
|
|||
Davide Madrisan
|
||||
Guenther Mair
|
||||
Pawel Malachowski
|
||||
Gerardo Malazdrewicz
|
||||
Ricardo Maraschini
|
||||
Michael Markstaller
|
||||
John Marquart
|
||||
Jason Martin
|
||||
Ernst-Dieter Martin
|
||||
Jason Martin
|
||||
Christopher Maser
|
||||
Mathieu Masseboeuf
|
||||
Alexander Matey
|
||||
|
@ -269,7 +261,6 @@ Jonathan Milby
|
|||
Russell Miller
|
||||
Eric J. Mislivec
|
||||
Janos Mohacsi
|
||||
John Morrissey
|
||||
Andreas Motl
|
||||
Tomas Mozes
|
||||
Gerd Mueller
|
||||
|
@ -306,7 +297,6 @@ Matt Pounsett
|
|||
Peter Pramberger
|
||||
Joe Presbrey
|
||||
Will Preston
|
||||
Platon Pronko
|
||||
Arnaud Quette
|
||||
Darian Rackham
|
||||
Peter Radcliffe
|
||||
|
@ -339,16 +329,14 @@ Sven Schaffranneck
|
|||
Christoph Schell
|
||||
Thomas Schimpke
|
||||
Benjamin Schmid
|
||||
Christian Schmidt
|
||||
Sebastian Schmidt
|
||||
Christian Schmidt
|
||||
Henning Schmiedehausen
|
||||
Christian Schneemann
|
||||
Cove Schneider
|
||||
Enrico Scholz
|
||||
Sebastian Schubert
|
||||
Christopher Schultz
|
||||
Kristian Schuster
|
||||
Franz Schwartau
|
||||
Russell Scibetti
|
||||
Noel Sebastien
|
||||
Andreas Seemueller
|
||||
|
@ -371,7 +359,6 @@ David Sullivan
|
|||
Kjell Sundtjonn
|
||||
Ziya Suzen
|
||||
Christian Tacke
|
||||
Stefan Taferner
|
||||
Danijel Tasov
|
||||
Michael Tiernan
|
||||
Ben Timby
|
||||
|
@ -382,7 +369,6 @@ Gabriele Tozzi
|
|||
Kyle Tucker
|
||||
Jerome Tytgat
|
||||
Daniel Uhlmann
|
||||
Patrick Uiterwijk
|
||||
Stéphane Urbanovski
|
||||
Matthias Urlichs
|
||||
Matteo HCE Valsasna
|
||||
|
@ -416,8 +402,8 @@ Shawn Wills
|
|||
Rob Windsor
|
||||
Mario Witte
|
||||
Alexander Wittig
|
||||
Tobias Wolf
|
||||
Brian De Wolf
|
||||
Tobias Wolf
|
||||
Eric Wunderlin
|
||||
Patric Wust
|
||||
Jamie Zawinski
|
||||
|
|
3465
aclocal.m4
vendored
3465
aclocal.m4
vendored
File diff suppressed because it is too large
Load diff
348
build-aux/compile
Executable file
348
build-aux/compile
Executable file
|
@ -0,0 +1,348 @@
|
|||
#! /bin/sh
|
||||
# Wrapper for compilers which do not understand '-c -o'.
|
||||
|
||||
scriptversion=2018-03-07.03; # UTC
|
||||
|
||||
# Copyright (C) 1999-2021 Free Software Foundation, Inc.
|
||||
# Written by Tom Tromey <tromey@cygnus.com>.
|
||||
#
|
||||
# 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, 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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
# This file is maintained in Automake, please report
|
||||
# bugs to <bug-automake@gnu.org> or send patches to
|
||||
# <automake-patches@gnu.org>.
|
||||
|
||||
nl='
|
||||
'
|
||||
|
||||
# We need space, tab and new line, in precisely that order. Quoting is
|
||||
# there to prevent tools from complaining about whitespace usage.
|
||||
IFS=" "" $nl"
|
||||
|
||||
file_conv=
|
||||
|
||||
# func_file_conv build_file lazy
|
||||
# Convert a $build file to $host form and store it in $file
|
||||
# Currently only supports Windows hosts. If the determined conversion
|
||||
# type is listed in (the comma separated) LAZY, no conversion will
|
||||
# take place.
|
||||
func_file_conv ()
|
||||
{
|
||||
file=$1
|
||||
case $file in
|
||||
/ | /[!/]*) # absolute file, and not a UNC file
|
||||
if test -z "$file_conv"; then
|
||||
# lazily determine how to convert abs files
|
||||
case `uname -s` in
|
||||
MINGW*)
|
||||
file_conv=mingw
|
||||
;;
|
||||
CYGWIN* | MSYS*)
|
||||
file_conv=cygwin
|
||||
;;
|
||||
*)
|
||||
file_conv=wine
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
case $file_conv/,$2, in
|
||||
*,$file_conv,*)
|
||||
;;
|
||||
mingw/*)
|
||||
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
|
||||
;;
|
||||
cygwin/* | msys/*)
|
||||
file=`cygpath -m "$file" || echo "$file"`
|
||||
;;
|
||||
wine/*)
|
||||
file=`winepath -w "$file" || echo "$file"`
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# func_cl_dashL linkdir
|
||||
# Make cl look for libraries in LINKDIR
|
||||
func_cl_dashL ()
|
||||
{
|
||||
func_file_conv "$1"
|
||||
if test -z "$lib_path"; then
|
||||
lib_path=$file
|
||||
else
|
||||
lib_path="$lib_path;$file"
|
||||
fi
|
||||
linker_opts="$linker_opts -LIBPATH:$file"
|
||||
}
|
||||
|
||||
# func_cl_dashl library
|
||||
# Do a library search-path lookup for cl
|
||||
func_cl_dashl ()
|
||||
{
|
||||
lib=$1
|
||||
found=no
|
||||
save_IFS=$IFS
|
||||
IFS=';'
|
||||
for dir in $lib_path $LIB
|
||||
do
|
||||
IFS=$save_IFS
|
||||
if $shared && test -f "$dir/$lib.dll.lib"; then
|
||||
found=yes
|
||||
lib=$dir/$lib.dll.lib
|
||||
break
|
||||
fi
|
||||
if test -f "$dir/$lib.lib"; then
|
||||
found=yes
|
||||
lib=$dir/$lib.lib
|
||||
break
|
||||
fi
|
||||
if test -f "$dir/lib$lib.a"; then
|
||||
found=yes
|
||||
lib=$dir/lib$lib.a
|
||||
break
|
||||
fi
|
||||
done
|
||||
IFS=$save_IFS
|
||||
|
||||
if test "$found" != yes; then
|
||||
lib=$lib.lib
|
||||
fi
|
||||
}
|
||||
|
||||
# func_cl_wrapper cl arg...
|
||||
# Adjust compile command to suit cl
|
||||
func_cl_wrapper ()
|
||||
{
|
||||
# Assume a capable shell
|
||||
lib_path=
|
||||
shared=:
|
||||
linker_opts=
|
||||
for arg
|
||||
do
|
||||
if test -n "$eat"; then
|
||||
eat=
|
||||
else
|
||||
case $1 in
|
||||
-o)
|
||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
||||
eat=1
|
||||
case $2 in
|
||||
*.o | *.[oO][bB][jJ])
|
||||
func_file_conv "$2"
|
||||
set x "$@" -Fo"$file"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
func_file_conv "$2"
|
||||
set x "$@" -Fe"$file"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
-I)
|
||||
eat=1
|
||||
func_file_conv "$2" mingw
|
||||
set x "$@" -I"$file"
|
||||
shift
|
||||
;;
|
||||
-I*)
|
||||
func_file_conv "${1#-I}" mingw
|
||||
set x "$@" -I"$file"
|
||||
shift
|
||||
;;
|
||||
-l)
|
||||
eat=1
|
||||
func_cl_dashl "$2"
|
||||
set x "$@" "$lib"
|
||||
shift
|
||||
;;
|
||||
-l*)
|
||||
func_cl_dashl "${1#-l}"
|
||||
set x "$@" "$lib"
|
||||
shift
|
||||
;;
|
||||
-L)
|
||||
eat=1
|
||||
func_cl_dashL "$2"
|
||||
;;
|
||||
-L*)
|
||||
func_cl_dashL "${1#-L}"
|
||||
;;
|
||||
-static)
|
||||
shared=false
|
||||
;;
|
||||
-Wl,*)
|
||||
arg=${1#-Wl,}
|
||||
save_ifs="$IFS"; IFS=','
|
||||
for flag in $arg; do
|
||||
IFS="$save_ifs"
|
||||
linker_opts="$linker_opts $flag"
|
||||
done
|
||||
IFS="$save_ifs"
|
||||
;;
|
||||
-Xlinker)
|
||||
eat=1
|
||||
linker_opts="$linker_opts $2"
|
||||
;;
|
||||
-*)
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
|
||||
func_file_conv "$1"
|
||||
set x "$@" -Tp"$file"
|
||||
shift
|
||||
;;
|
||||
*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
|
||||
func_file_conv "$1" mingw
|
||||
set x "$@" "$file"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
shift
|
||||
done
|
||||
if test -n "$linker_opts"; then
|
||||
linker_opts="-link$linker_opts"
|
||||
fi
|
||||
exec "$@" $linker_opts
|
||||
exit 1
|
||||
}
|
||||
|
||||
eat=
|
||||
|
||||
case $1 in
|
||||
'')
|
||||
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
||||
exit 1;
|
||||
;;
|
||||
-h | --h*)
|
||||
cat <<\EOF
|
||||
Usage: compile [--help] [--version] PROGRAM [ARGS]
|
||||
|
||||
Wrapper for compilers which do not understand '-c -o'.
|
||||
Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
|
||||
arguments, and rename the output as expected.
|
||||
|
||||
If you are trying to build a whole package this is not the
|
||||
right script to run: please start by reading the file 'INSTALL'.
|
||||
|
||||
Report bugs to <bug-automake@gnu.org>.
|
||||
EOF
|
||||
exit $?
|
||||
;;
|
||||
-v | --v*)
|
||||
echo "compile $scriptversion"
|
||||
exit $?
|
||||
;;
|
||||
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
|
||||
icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
|
||||
func_cl_wrapper "$@" # Doesn't return...
|
||||
;;
|
||||
esac
|
||||
|
||||
ofile=
|
||||
cfile=
|
||||
|
||||
for arg
|
||||
do
|
||||
if test -n "$eat"; then
|
||||
eat=
|
||||
else
|
||||
case $1 in
|
||||
-o)
|
||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
||||
# So we strip '-o arg' only if arg is an object.
|
||||
eat=1
|
||||
case $2 in
|
||||
*.o | *.obj)
|
||||
ofile=$2
|
||||
;;
|
||||
*)
|
||||
set x "$@" -o "$2"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*.c)
|
||||
cfile=$1
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
shift
|
||||
done
|
||||
|
||||
if test -z "$ofile" || test -z "$cfile"; then
|
||||
# If no '-o' option was seen then we might have been invoked from a
|
||||
# pattern rule where we don't need one. That is ok -- this is a
|
||||
# normal compilation that the losing compiler can handle. If no
|
||||
# '.c' file was seen then we are probably linking. That is also
|
||||
# ok.
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
# Name of file we expect compiler to create.
|
||||
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
|
||||
|
||||
# Create the lock directory.
|
||||
# Note: use '[/\\:.-]' here to ensure that we don't use the same name
|
||||
# that we are using for the .o file. Also, base the name on the expected
|
||||
# object file name, since that is what matters with a parallel build.
|
||||
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
|
||||
while true; do
|
||||
if mkdir "$lockdir" >/dev/null 2>&1; then
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
# FIXME: race condition here if user kills between mkdir and trap.
|
||||
trap "rmdir '$lockdir'; exit 1" 1 2 15
|
||||
|
||||
# Run the compile.
|
||||
"$@"
|
||||
ret=$?
|
||||
|
||||
if test -f "$cofile"; then
|
||||
test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
|
||||
elif test -f "${cofile}bj"; then
|
||||
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
|
||||
fi
|
||||
|
||||
rmdir "$lockdir"
|
||||
exit $ret
|
||||
|
||||
# Local Variables:
|
||||
# mode: shell-script
|
||||
# sh-indentation: 2
|
||||
# eval: (add-hook 'before-save-hook 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC0"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
1500
build-aux/config.guess
vendored
1500
build-aux/config.guess
vendored
File diff suppressed because it is too large
Load diff
|
@ -2,7 +2,7 @@
|
|||
# Output a system dependent set of variables, describing how to set the
|
||||
# run time search path of shared libraries in an executable.
|
||||
#
|
||||
# Copyright 1996-2023 Free Software Foundation, Inc.
|
||||
# Copyright 1996-2013 Free Software Foundation, Inc.
|
||||
# Taken from GNU libtool, 2001
|
||||
# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
|
||||
#
|
||||
|
@ -367,11 +367,15 @@ else
|
|||
dgux*)
|
||||
hardcode_libdir_flag_spec='-L$libdir'
|
||||
;;
|
||||
freebsd2.[01]*)
|
||||
freebsd2.2*)
|
||||
hardcode_libdir_flag_spec='-R$libdir'
|
||||
hardcode_direct=yes
|
||||
;;
|
||||
freebsd2*)
|
||||
hardcode_direct=yes
|
||||
hardcode_minus_L=yes
|
||||
;;
|
||||
freebsd* | dragonfly* | midnightbsd*)
|
||||
freebsd* | dragonfly*)
|
||||
hardcode_libdir_flag_spec='-R$libdir'
|
||||
hardcode_direct=yes
|
||||
;;
|
||||
|
@ -544,11 +548,13 @@ case "$host_os" in
|
|||
dgux*)
|
||||
library_names_spec='$libname$shrext'
|
||||
;;
|
||||
freebsd[23].*)
|
||||
library_names_spec='$libname$shrext$versuffix'
|
||||
;;
|
||||
freebsd* | dragonfly* | midnightbsd*)
|
||||
library_names_spec='$libname$shrext'
|
||||
freebsd* | dragonfly*)
|
||||
case "$host_os" in
|
||||
freebsd[123]*)
|
||||
library_names_spec='$libname$shrext$versuffix' ;;
|
||||
*)
|
||||
library_names_spec='$libname$shrext' ;;
|
||||
esac
|
||||
;;
|
||||
gnu*)
|
||||
library_names_spec='$libname$shrext'
|
||||
|
|
2855
build-aux/config.sub
vendored
2855
build-aux/config.sub
vendored
File diff suppressed because it is too large
Load diff
|
@ -3,7 +3,7 @@
|
|||
|
||||
scriptversion=2018-03-07.03; # UTC
|
||||
|
||||
# Copyright (C) 1999-2020 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1999-2021 Free Software Foundation, Inc.
|
||||
|
||||
# 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
|
||||
|
|
|
@ -189,7 +189,7 @@ func_basename ()
|
|||
# to NONDIR_REPLACEMENT.
|
||||
# value returned in "$func_dirname_result"
|
||||
# basename: Compute filename of FILE.
|
||||
# value returned in "$func_basename_result"
|
||||
# value retuned in "$func_basename_result"
|
||||
# Implementation must be kept synchronized with func_dirname
|
||||
# and func_basename. For efficiency, we do not delegate to
|
||||
# those functions but instead duplicate the functionality here.
|
||||
|
@ -522,7 +522,7 @@ func_mkdir_p ()
|
|||
# While some portion of DIR does not yet exist...
|
||||
while test ! -d "$my_directory_path"; do
|
||||
# ...make a list in topmost first order. Use a colon delimited
|
||||
# list in case some portion of path contains whitespace.
|
||||
# list incase some portion of path contains whitespace.
|
||||
my_dir_list="$my_directory_path:$my_dir_list"
|
||||
|
||||
# If the last portion added has no slash in it, the list is done
|
||||
|
@ -4394,7 +4394,7 @@ EOF
|
|||
{
|
||||
/* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
|
||||
namespace, but it is not one of the ones we know about and
|
||||
have already dealt with, above (including dump-script), then
|
||||
have already dealt with, above (inluding dump-script), then
|
||||
report an error. Otherwise, targets might begin to believe
|
||||
they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
|
||||
namespace. The first time any user complains about this, we'll
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
scriptversion=2018-03-07.03; # UTC
|
||||
|
||||
# Copyright (C) 1996-2020 Free Software Foundation, Inc.
|
||||
# Copyright (C) 1996-2021 Free Software Foundation, Inc.
|
||||
# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
|
|
10
build-aux/snippet/_Noreturn.h
Normal file
10
build-aux/snippet/_Noreturn.h
Normal file
|
@ -0,0 +1,10 @@
|
|||
#if !defined _Noreturn && __STDC_VERSION__ < 201112
|
||||
# if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) \
|
||||
|| 0x5110 <= __SUNPRO_C)
|
||||
# define _Noreturn __attribute__ ((__noreturn__))
|
||||
# elif 1200 <= _MSC_VER
|
||||
# define _Noreturn __declspec (noreturn)
|
||||
# else
|
||||
# define _Noreturn
|
||||
# endif
|
||||
#endif
|
|
@ -1,24 +1,24 @@
|
|||
/* A C macro for declaring that specific arguments must not be NULL.
|
||||
Copyright (C) 2009-2023 Free Software Foundation, Inc.
|
||||
Copyright (C) 2009-2013 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation; either version 2 of the License, or
|
||||
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
|
||||
Lesser General Public License for more details.
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
|
||||
that the values passed as arguments n, ..., m must be non-NULL pointers.
|
||||
n = 1 stands for the first argument, n = 2 for the second argument etc. */
|
||||
#ifndef _GL_ARG_NONNULL
|
||||
# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
|
||||
# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
|
||||
# define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
|
||||
# else
|
||||
# define _GL_ARG_NONNULL(params)
|
|
@ -1,31 +1,22 @@
|
|||
/* C++ compatible function declaration macros.
|
||||
Copyright (C) 2010-2023 Free Software Foundation, Inc.
|
||||
Copyright (C) 2010-2013 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser General Public License as published
|
||||
by the Free Software Foundation; either version 2 of the License, or
|
||||
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
|
||||
Lesser General Public License for more details.
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _GL_CXXDEFS_H
|
||||
#define _GL_CXXDEFS_H
|
||||
|
||||
/* Begin/end the GNULIB_NAMESPACE namespace. */
|
||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||
# define _GL_BEGIN_NAMESPACE namespace GNULIB_NAMESPACE {
|
||||
# define _GL_END_NAMESPACE }
|
||||
#else
|
||||
# define _GL_BEGIN_NAMESPACE
|
||||
# define _GL_END_NAMESPACE
|
||||
#endif
|
||||
|
||||
/* The three most frequent use cases of these macros are:
|
||||
|
||||
* For providing a substitute for a function that is missing on some
|
||||
|
@ -120,25 +111,14 @@
|
|||
that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
|
||||
Example:
|
||||
_GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
|
||||
|
||||
Wrapping rpl_func in an object with an inline conversion operator
|
||||
avoids a reference to rpl_func unless GNULIB_NAMESPACE::func is
|
||||
actually used in the program. */
|
||||
*/
|
||||
#define _GL_CXXALIAS_RPL(func,rettype,parameters) \
|
||||
_GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
|
||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||
# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
|
||||
namespace GNULIB_NAMESPACE \
|
||||
{ \
|
||||
static const struct _gl_ ## func ## _wrapper \
|
||||
{ \
|
||||
typedef rettype (*type) parameters; \
|
||||
\
|
||||
inline operator type () const \
|
||||
{ \
|
||||
return ::rpl_func; \
|
||||
} \
|
||||
} func = {}; \
|
||||
rettype (*const func) parameters = ::rpl_func; \
|
||||
} \
|
||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||
#else
|
||||
|
@ -146,16 +126,6 @@
|
|||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||
#endif
|
||||
|
||||
/* _GL_CXXALIAS_MDA (func, rettype, parameters);
|
||||
is to be used when func is a Microsoft deprecated alias, on native Windows.
|
||||
It declares a C++ alias called GNULIB_NAMESPACE::func
|
||||
that redirects to _func, if GNULIB_NAMESPACE is defined.
|
||||
Example:
|
||||
_GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
|
||||
*/
|
||||
#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
|
||||
_GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
|
||||
|
||||
/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
|
||||
is like _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
|
||||
except that the C function rpl_func may have a slightly different
|
||||
|
@ -165,15 +135,8 @@
|
|||
# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
|
||||
namespace GNULIB_NAMESPACE \
|
||||
{ \
|
||||
static const struct _gl_ ## func ## _wrapper \
|
||||
{ \
|
||||
typedef rettype (*type) parameters; \
|
||||
\
|
||||
inline operator type () const \
|
||||
{ \
|
||||
return reinterpret_cast<type>(::rpl_func); \
|
||||
} \
|
||||
} func = {}; \
|
||||
rettype (*const func) parameters = \
|
||||
reinterpret_cast<rettype(*)parameters>(::rpl_func); \
|
||||
} \
|
||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||
#else
|
||||
|
@ -181,38 +144,25 @@
|
|||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||
#endif
|
||||
|
||||
/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
|
||||
is like _GL_CXXALIAS_MDA (func, rettype, parameters);
|
||||
except that the C function func may have a slightly different declaration.
|
||||
A cast is used to silence the "invalid conversion" error that would
|
||||
otherwise occur. */
|
||||
#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
|
||||
_GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
|
||||
|
||||
/* _GL_CXXALIAS_SYS (func, rettype, parameters);
|
||||
declares a C++ alias called GNULIB_NAMESPACE::func
|
||||
that redirects to the system provided function func, if GNULIB_NAMESPACE
|
||||
is defined.
|
||||
Example:
|
||||
_GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
|
||||
|
||||
Wrapping func in an object with an inline conversion operator
|
||||
avoids a reference to func unless GNULIB_NAMESPACE::func is
|
||||
actually used in the program. */
|
||||
*/
|
||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
||||
# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
|
||||
namespace GNULIB_NAMESPACE \
|
||||
{ \
|
||||
static const struct _gl_ ## func ## _wrapper \
|
||||
{ \
|
||||
typedef rettype (*type) parameters; \
|
||||
\
|
||||
inline operator type () const \
|
||||
{ \
|
||||
return ::func; \
|
||||
} \
|
||||
} func = {}; \
|
||||
} \
|
||||
/* If we were to write
|
||||
rettype (*const func) parameters = ::func;
|
||||
like above in _GL_CXXALIAS_RPL_1, the compiler could optimize calls
|
||||
better (remove an indirection through a 'static' pointer variable),
|
||||
but then the _GL_CXXALIASWARN macro below would cause a warning not only
|
||||
for uses of ::func but also for uses of GNULIB_NAMESPACE::func. */
|
||||
# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
|
||||
namespace GNULIB_NAMESPACE \
|
||||
{ \
|
||||
static rettype (*func) parameters = ::func; \
|
||||
} \
|
||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||
#else
|
||||
# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
|
||||
|
@ -228,15 +178,8 @@
|
|||
# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
|
||||
namespace GNULIB_NAMESPACE \
|
||||
{ \
|
||||
static const struct _gl_ ## func ## _wrapper \
|
||||
{ \
|
||||
typedef rettype (*type) parameters; \
|
||||
\
|
||||
inline operator type () const \
|
||||
{ \
|
||||
return reinterpret_cast<type>(::func); \
|
||||
} \
|
||||
} func = {}; \
|
||||
static rettype (*func) parameters = \
|
||||
reinterpret_cast<rettype(*)parameters>(::func); \
|
||||
} \
|
||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||
#else
|
||||
|
@ -259,15 +202,9 @@
|
|||
# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
|
||||
namespace GNULIB_NAMESPACE \
|
||||
{ \
|
||||
static const struct _gl_ ## func ## _wrapper \
|
||||
{ \
|
||||
typedef rettype (*type) parameters; \
|
||||
\
|
||||
inline operator type () const \
|
||||
{ \
|
||||
return reinterpret_cast<type>((rettype2 (*) parameters2)(::func)); \
|
||||
} \
|
||||
} func = {}; \
|
||||
static rettype (*func) parameters = \
|
||||
reinterpret_cast<rettype(*)parameters>( \
|
||||
(rettype2(*)parameters2)(::func)); \
|
||||
} \
|
||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
||||
#else
|
||||
|
@ -284,9 +221,9 @@
|
|||
_GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
|
||||
# define _GL_CXXALIASWARN_1(func,namespace) \
|
||||
_GL_CXXALIASWARN_2 (func, namespace)
|
||||
/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
|
||||
/* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
|
||||
we enable the warning only when not optimizing. */
|
||||
# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
|
||||
# if !__OPTIMIZE__
|
||||
# define _GL_CXXALIASWARN_2(func,namespace) \
|
||||
_GL_WARN_ON_USE (func, \
|
||||
"The symbol ::" #func " refers to the system function. " \
|
||||
|
@ -312,13 +249,16 @@
|
|||
GNULIB_NAMESPACE)
|
||||
# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
|
||||
_GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
|
||||
/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
|
||||
/* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
|
||||
we enable the warning only when not optimizing. */
|
||||
# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
|
||||
# if !__OPTIMIZE__
|
||||
# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
|
||||
_GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
|
||||
_GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
|
||||
"The symbol ::" #func " refers to the system function. " \
|
||||
"Use " #namespace "::" #func " instead.")
|
||||
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
||||
# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
|
||||
extern __typeof__ (func) func
|
||||
# else
|
||||
# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
|
||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
109
build-aux/snippet/warn-on-use.h
Normal file
109
build-aux/snippet/warn-on-use.h
Normal file
|
@ -0,0 +1,109 @@
|
|||
/* A C macro for emitting warnings if a function is used.
|
||||
Copyright (C) 2010-2013 Free Software Foundation, Inc.
|
||||
|
||||
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 <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* _GL_WARN_ON_USE (function, "literal string") issues a declaration
|
||||
for FUNCTION which will then trigger a compiler warning containing
|
||||
the text of "literal string" anywhere that function is called, if
|
||||
supported by the compiler. If the compiler does not support this
|
||||
feature, the macro expands to an unused extern declaration.
|
||||
|
||||
This macro is useful for marking a function as a potential
|
||||
portability trap, with the intent that "literal string" include
|
||||
instructions on the replacement function that should be used
|
||||
instead. However, one of the reasons that a function is a
|
||||
portability trap is if it has the wrong signature. Declaring
|
||||
FUNCTION with a different signature in C is a compilation error, so
|
||||
this macro must use the same type as any existing declaration so
|
||||
that programs that avoid the problematic FUNCTION do not fail to
|
||||
compile merely because they included a header that poisoned the
|
||||
function. But this implies that _GL_WARN_ON_USE is only safe to
|
||||
use if FUNCTION is known to already have a declaration. Use of
|
||||
this macro implies that there must not be any other macro hiding
|
||||
the declaration of FUNCTION; but undefining FUNCTION first is part
|
||||
of the poisoning process anyway (although for symbols that are
|
||||
provided only via a macro, the result is a compilation error rather
|
||||
than a warning containing "literal string"). Also note that in
|
||||
C++, it is only safe to use if FUNCTION has no overloads.
|
||||
|
||||
For an example, it is possible to poison 'getline' by:
|
||||
- adding a call to gl_WARN_ON_USE_PREPARE([[#include <stdio.h>]],
|
||||
[getline]) in configure.ac, which potentially defines
|
||||
HAVE_RAW_DECL_GETLINE
|
||||
- adding this code to a header that wraps the system <stdio.h>:
|
||||
#undef getline
|
||||
#if HAVE_RAW_DECL_GETLINE
|
||||
_GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but"
|
||||
"not universally present; use the gnulib module getline");
|
||||
#endif
|
||||
|
||||
It is not possible to directly poison global variables. But it is
|
||||
possible to write a wrapper accessor function, and poison that
|
||||
(less common usage, like &environ, will cause a compilation error
|
||||
rather than issue the nice warning, but the end result of informing
|
||||
the developer about their portability problem is still achieved):
|
||||
#if HAVE_RAW_DECL_ENVIRON
|
||||
static char ***rpl_environ (void) { return &environ; }
|
||||
_GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared");
|
||||
# undef environ
|
||||
# define environ (*rpl_environ ())
|
||||
#endif
|
||||
*/
|
||||
#ifndef _GL_WARN_ON_USE
|
||||
|
||||
# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
|
||||
/* A compiler attribute is available in gcc versions 4.3.0 and later. */
|
||||
# define _GL_WARN_ON_USE(function, message) \
|
||||
extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
|
||||
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
||||
/* Verify the existence of the function. */
|
||||
# define _GL_WARN_ON_USE(function, message) \
|
||||
extern __typeof__ (function) function
|
||||
# else /* Unsupported. */
|
||||
# define _GL_WARN_ON_USE(function, message) \
|
||||
_GL_WARN_EXTERN_C int _gl_warn_on_use
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
|
||||
is like _GL_WARN_ON_USE (function, "string"), except that the function is
|
||||
declared with the given prototype, consisting of return type, parameters,
|
||||
and attributes.
|
||||
This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
|
||||
not work in this case. */
|
||||
#ifndef _GL_WARN_ON_USE_CXX
|
||||
# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
|
||||
# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
|
||||
extern rettype function parameters_and_attributes \
|
||||
__attribute__ ((__warning__ (msg)))
|
||||
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
||||
/* Verify the existence of the function. */
|
||||
# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
|
||||
extern rettype function parameters_and_attributes
|
||||
# else /* Unsupported. */
|
||||
# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
|
||||
_GL_WARN_EXTERN_C int _gl_warn_on_use
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* _GL_WARN_EXTERN_C declaration;
|
||||
performs the declaration with C linkage. */
|
||||
#ifndef _GL_WARN_EXTERN_C
|
||||
# if defined __cplusplus
|
||||
# define _GL_WARN_EXTERN_C extern "C"
|
||||
# else
|
||||
# define _GL_WARN_EXTERN_C extern
|
||||
# endif
|
||||
#endif
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
scriptversion=2018-03-07.03; # UTC
|
||||
|
||||
# Copyright (C) 2011-2020 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2011-2021 Free Software Foundation, Inc.
|
||||
#
|
||||
# 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
|
||||
|
@ -105,8 +105,11 @@ trap "st=130; $do_exit" 2
|
|||
trap "st=141; $do_exit" 13
|
||||
trap "st=143; $do_exit" 15
|
||||
|
||||
# Test script is run here.
|
||||
"$@" >$log_file 2>&1
|
||||
# Test script is run here. We create the file first, then append to it,
|
||||
# to ameliorate tests themselves also writing to the log file. Our tests
|
||||
# don't, but others can (automake bug#35762).
|
||||
: >"$log_file"
|
||||
"$@" >>"$log_file" 2>&1
|
||||
estatus=$?
|
||||
|
||||
if test $enable_hard_errors = no && test $estatus -eq 99; then
|
||||
|
@ -128,7 +131,7 @@ esac
|
|||
# know whether the test passed or failed simply by looking at the '.log'
|
||||
# file, without the need of also peaking into the corresponding '.trs'
|
||||
# file (automake bug#11814).
|
||||
echo "$res $test_name (exit status: $estatus)" >>$log_file
|
||||
echo "$res $test_name (exit status: $estatus)" >>"$log_file"
|
||||
|
||||
# Report outcome to console.
|
||||
echo "${col}${res}${std}: $test_name"
|
||||
|
|
2440
config.h.in
2440
config.h.in
File diff suppressed because it is too large
Load diff
|
@ -30,7 +30,7 @@ int main(){
|
|||
/* pipefd[1] is for writing to the pipe. We want the output
|
||||
* that used to go to the standard output (file descriptor 1)
|
||||
* to be written to the pipe. The following command does this,
|
||||
* creating a new file descriptor 1 (the lowest available)
|
||||
* creating a new file descripter 1 (the lowest available)
|
||||
* that writes where pipefd[1] goes. */
|
||||
dup (pipefd[1]); /* points pipefd at file descriptor */
|
||||
/* the child isn't going to read from the pipe, so
|
||||
|
|
60
configure.ac
60
configure.ac
|
@ -1,6 +1,6 @@
|
|||
dnl Process this file with autoconf to produce a configure script.
|
||||
AC_PREREQ(2.64)
|
||||
AC_INIT(monitoring-plugins,2.3.5)
|
||||
AC_PREREQ(2.59)
|
||||
AC_INIT(monitoring-plugins,2.3.3)
|
||||
AC_CONFIG_SRCDIR(NPTest.pm)
|
||||
AC_CONFIG_FILES([gl/Makefile])
|
||||
AC_CONFIG_AUX_DIR(build-aux)
|
||||
|
@ -328,25 +328,6 @@ AS_IF([test "x$with_ldap" != "xno"], [
|
|||
LIBS="$_SAVEDLIBS"
|
||||
])
|
||||
|
||||
|
||||
AC_ARG_WITH([systemd], [AS_HELP_STRING([--without-systemd], [Skips systemd support])])
|
||||
|
||||
dnl Check for libsystemd
|
||||
AS_IF([test "x$with_systemd" != "xno"], [
|
||||
_SAVEDLIBS="$LIBS"
|
||||
AC_CHECK_LIB(systemd,sd_get_sessions,,,-lsystemd)
|
||||
if test "$ac_cv_lib_systemd_sd_get_sessions" = "yes"; then
|
||||
SYSTEMDLIBS="-lsystemd"
|
||||
SYSTEMDINCLUDE=""
|
||||
AC_SUBST(SYSTEMDLIBS)
|
||||
AC_SUBST(SYSTEMDINCLUDE)
|
||||
else
|
||||
AC_MSG_WARN([Skipping systemd support])
|
||||
fi
|
||||
LIBS="$_SAVEDLIBS"
|
||||
])
|
||||
|
||||
|
||||
dnl Check for headers used by check_ide_smart
|
||||
case $host in
|
||||
*linux*)
|
||||
|
@ -621,6 +602,7 @@ AC_C_CONST
|
|||
AC_STRUCT_TM
|
||||
AC_TYPE_PID_T
|
||||
AC_TYPE_SIZE_T
|
||||
AC_TYPE_SIGNAL
|
||||
|
||||
AC_CACHE_CHECK([for va_copy],ac_cv_HAVE_VA_COPY,[
|
||||
AC_TRY_LINK([#include <stdarg.h>
|
||||
|
@ -644,16 +626,12 @@ AC_TRY_COMPILE([#include <sys/time.h>],
|
|||
[struct timeval *tv;
|
||||
struct timezone *tz;],
|
||||
AC_DEFINE(HAVE_STRUCT_TIMEVAL,1,[Define if we have a timeval structure])
|
||||
FOUND_STRUCT_TIMEVAL="yes")
|
||||
|
||||
if test x"$FOUND_STRUCT_TIMEVAL" = x"yes"; then
|
||||
AC_TRY_COMPILE([#include <sys/time.h>],
|
||||
[struct timeval *tv;
|
||||
struct timezone *tz;
|
||||
gettimeofday(tv, tz);],
|
||||
AC_DEFINE(HAVE_GETTIMEOFDAY,1,[Define if gettimeofday is found]),
|
||||
AC_DEFINE(NEED_GETTIMEOFDAY,1,[Define if gettimeofday is needed]))
|
||||
fi
|
||||
AC_TRY_COMPILE([#include <sys/time.h>],
|
||||
[struct timeval *tv;
|
||||
struct timezone *tz;
|
||||
gettimeofday(tv, tz);],
|
||||
AC_DEFINE(HAVE_GETTIMEOFDAY,1,[Define if gettimeofday is found]),
|
||||
AC_DEFINE(NEED_GETTIMEOFDAY,1,[Define if gettimeofday is needed])))
|
||||
|
||||
dnl Checks for library functions.
|
||||
AC_CHECK_FUNCS(memmove select socket strdup strstr strtol strtoul floor)
|
||||
|
@ -954,7 +932,7 @@ elif ps -Ao 's comm vsz rss uid user pid ppid args' 2>/dev/null | \
|
|||
then
|
||||
ac_cv_ps_varlist="[procstat,&procuid,&procpid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]"
|
||||
ac_cv_ps_command="$PATH_TO_PS -Ao 's uid pid ppid vsz rss pcpu comm args'"
|
||||
# There must be no space between the %s and %n due to a weird problem in sscanf where
|
||||
# There must be no space between the %s and %n due to a wierd problem in sscanf where
|
||||
# it will return %n as longer than the line length
|
||||
ac_cv_ps_format="%s %d %d %d %d %d %f %s%n"
|
||||
ac_cv_ps_cols=9
|
||||
|
@ -1574,7 +1552,7 @@ if test -n "$PATH_TO_SUDO"
|
|||
then
|
||||
AC_DEFINE_UNQUOTED(PATH_TO_SUDO,"$PATH_TO_SUDO",[path to sudo])
|
||||
else
|
||||
AC_MSG_WARN([Could not find sudo or equivalent])
|
||||
AC_MSG_WARN([Could not find sudo or eqivalent])
|
||||
fi
|
||||
|
||||
AC_PATH_PROG(PATH_TO_MAILQ,mailq)
|
||||
|
@ -1585,7 +1563,7 @@ if test -n "$PATH_TO_MAILQ"
|
|||
then
|
||||
AC_DEFINE_UNQUOTED(PATH_TO_MAILQ,"$PATH_TO_MAILQ",[path to mailq])
|
||||
else
|
||||
AC_MSG_WARN([Could not find mailq or equivalent])
|
||||
AC_MSG_WARN([Could not find mailq or eqivalent])
|
||||
fi
|
||||
|
||||
AC_PATH_PROG(PATH_TO_QMAIL_QSTAT,qmail-qstat)
|
||||
|
@ -1596,7 +1574,7 @@ if test -n "$PATH_TO_QMAIL_QSTAT"
|
|||
then
|
||||
AC_DEFINE_UNQUOTED(PATH_TO_QMAIL_QSTAT,"$PATH_TO_QMAIL_QSTAT",[path to qmail-qstat])
|
||||
else
|
||||
AC_MSG_WARN([Could not find qmail-qstat or equivalent])
|
||||
AC_MSG_WARN([Could not find qmail-qstat or eqivalent])
|
||||
fi
|
||||
|
||||
dnl SWAP info required is amount allocated/available and amount free
|
||||
|
@ -1614,13 +1592,13 @@ then
|
|||
grep -E -i "^lswap +path +pri +swaplo +blocks +free +maxswap" \
|
||||
>/dev/null]
|
||||
then
|
||||
ac_cv_swap_format=[" %*d %*s %*d,%*d %*d %*d %lu %lu"]
|
||||
ac_cv_swap_format=[" %*d %*s %*d,%*d %*d %*d %f %f"]
|
||||
ac_cv_swap_conv=2048
|
||||
AC_MSG_RESULT([using IRIX format swap])
|
||||
|
||||
elif [$PATH_TO_SWAP -l 2>/dev/null | grep -E -i "^path +dev +swaplo +blocks +free" >/dev/null]
|
||||
then
|
||||
ac_cv_swap_format=["%*s %*[0-9,-] %*d %lu %lu"]
|
||||
ac_cv_swap_format=["%*s %*[0-9,-] %*d %f %f"]
|
||||
ac_cv_swap_conv=2048
|
||||
AC_MSG_RESULT([using Unixware format swap])
|
||||
else
|
||||
|
@ -1644,7 +1622,7 @@ then
|
|||
|
||||
if [$PATH_TO_SWAPINFO -k 2>/dev/null | grep -E -i "^Device +1K-blocks +Used +Avail" >/dev/null]
|
||||
then
|
||||
ac_cv_swap_format=["%*s %lu %*d %lu"]
|
||||
ac_cv_swap_format=["%*s %f %*d %f"]
|
||||
ac_cv_swap_conv=1024
|
||||
AC_MSG_RESULT([using FreeBSD format swapinfo])
|
||||
fi
|
||||
|
@ -1653,7 +1631,7 @@ elif [$PATH_TO_SWAPINFO -dfM 2>/dev/null | grep -E -i "^TYPE +AVAIL +USED +FREE"
|
|||
then
|
||||
ac_cv_have_swap=yes
|
||||
ac_cv_swap_command="$PATH_TO_SWAPINFO -dfM"
|
||||
ac_cv_swap_format=["%*s %lu %*d %lu"]
|
||||
ac_cv_swap_format=["%*s %f %*d %f"]
|
||||
ac_cv_swap_conv=1024
|
||||
AC_MSG_RESULT([using HP-UX format swapinfo])
|
||||
fi
|
||||
|
@ -1668,7 +1646,7 @@ if [$PATH_TO_LSPS -a 2>/dev/null | grep -E -i "^Page Space" > /dev/null]
|
|||
then
|
||||
ac_cv_have_swap=yes
|
||||
ac_cv_swap_command="$PATH_TO_LSPS -a"
|
||||
ac_cv_swap_format=["%*s %*s %*s %lu%*s %lu %*s"]
|
||||
ac_cv_swap_format=["%*s %*s %*s %f%*s %f %*s"]
|
||||
ac_cv_swap_conv=1
|
||||
AC_MSG_RESULT([using AIX lsps])
|
||||
fi
|
||||
|
@ -1854,7 +1832,7 @@ AM_GNU_GETTEXT([external], [need-ngettext])
|
|||
AM_GNU_GETTEXT_VERSION(0.15)
|
||||
|
||||
dnl Check for Redhat spopen problem
|
||||
dnl Weird problem where ECHILD is returned from a wait call in error
|
||||
dnl Wierd problem where ECHILD is returned from a wait call in error
|
||||
dnl Only appears to affect nslookup and dig calls. Only affects redhat around
|
||||
dnl 2.6.9-11 (okay in 2.6.9-5). Redhat investigating root cause
|
||||
dnl We patch plugins/popen.c
|
||||
|
|
23
debian/.gitlab-ci.yml
vendored
23
debian/.gitlab-ci.yml
vendored
|
@ -1,15 +1,14 @@
|
|||
---
|
||||
include:
|
||||
- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/recipes/debian.yml
|
||||
- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
|
||||
- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml
|
||||
|
||||
variables:
|
||||
RELEASE: 'unstable'
|
||||
SALSA_CI_DISABLE_APTLY: 0
|
||||
SALSA_CI_DISABLE_AUTOPKGTEST: 0
|
||||
SALSA_CI_DISABLE_BLHC: 1
|
||||
SALSA_CI_DISABLE_LINTIAN: 0
|
||||
SALSA_CI_DISABLE_PIUPARTS: 0
|
||||
SALSA_CI_DISABLE_REPROTEST: 0
|
||||
SALSA_CI_DISABLE_BUILD_PACKAGE_ALL: 0
|
||||
SALSA_CI_DISABLE_BUILD_PACKAGE_ANY: 0
|
||||
SALSA_CI_ENABLE_BUILD_PACKAGE_TWICE: 1
|
||||
RELEASE: 'unstable'
|
||||
SALSA_CI_DISABLE_APTLY: 0
|
||||
SALSA_CI_DISABLE_AUTOPKGTEST: 0
|
||||
SALSA_CI_DISABLE_BLHC: 0
|
||||
SALSA_CI_DISABLE_LINTIAN: 0
|
||||
SALSA_CI_DISABLE_PIUPARTS: 0
|
||||
SALSA_CI_DISABLE_REPROTEST: 0
|
||||
SALSA_CI_DISABLE_BUILD_PACKAGE_ALL: 0
|
||||
SALSA_CI_DISABLE_BUILD_PACKAGE_ANY: 0
|
||||
|
|
45
debian/changelog
vendored
45
debian/changelog
vendored
|
@ -1,49 +1,8 @@
|
|||
monitoring-plugins (2.3.5-2) UNRELEASED; urgency=medium
|
||||
monitoring-plugins (2.3.3-6) UNRELEASED; urgency=medium
|
||||
|
||||
*
|
||||
|
||||
-- Jan Wagner <waja@cyconet.org> Sat, 21 Oct 2023 21:52:04 +0200
|
||||
|
||||
monitoring-plugins (2.3.5-1) unstable; urgency=medium
|
||||
|
||||
[ Jan Wagner ]
|
||||
* [a20810f] Adding d/p/36_check_smtp_adding_proxy_header from upstream
|
||||
* [0250eb9] Adding d/p/37_check_smtp_Adding_SNI from upstream
|
||||
* [1381a20] Remove left over d/p/31_checl_mailq_separate_submission_queue
|
||||
|
||||
[ Bas Couwenberg ]
|
||||
* [7c86d65] Explicitly enable test-build-twice job.
|
||||
|
||||
[ Jan Wagner ]
|
||||
* [de72f6f] New upstream version 2.3.4
|
||||
* [5956793] New upstream version 2.3.5
|
||||
* [f07f4db] Drop patches integrated by upstream
|
||||
|
||||
-- Jan Wagner <waja@cyconet.org> Wed, 18 Oct 2023 12:04:05 +0200
|
||||
|
||||
monitoring-plugins (2.3.3-6) unstable; urgency=medium
|
||||
|
||||
* [e1f9786] Adding d/p/14_check_curl_fix_SSL_with_multiple_IPs from upstream
|
||||
* [534d0c8] Adding d/p/30_check_radius_radcli_1.3.1_support from upstream
|
||||
* [bd72df2] Adding d/p/31_checl_mailq_separate_submission_queue from upstream
|
||||
* [567890c] Adding d/p/32_check_disk_add_ignore_missing from upstream
|
||||
(Closes: #516097)
|
||||
* [47b7589] Adding d/p/15_check_swap_remove_includes from upstream
|
||||
* [6f89be8] Adding d/p/33_check_procs_exclude-process from upstream
|
||||
* [983507a] Adding d/p/34_check_curl_fix_compare_warning from upstream
|
||||
* [9225592] Adding d/p/17_fix_exit_codes from upstream
|
||||
* [3a0d875] Adding d/p/18_check_mysql_fix_typo from upstream
|
||||
* [17688c7] Adding d/p/19_check_nwstat_fix_typo from upstream
|
||||
* [e0cfe77] Adding d/p/20_chech_nt_fix_encoding from upstream
|
||||
* [3da2163] Adding d/p/21_check_pgsql_extra_output from upstream
|
||||
* [7cbe4b6] Adding d/p/22_check_disk_avoid_mount from upstream
|
||||
* [01be8ce] d/p/series: Fix typo
|
||||
* [85d9e03] Adding d/p/23_check_mysql_fix_error_handling from upstream
|
||||
* [555d643] CI: Disable BLHC job
|
||||
* [85a271e] Adding d/p/24_check_disk_fix_SI_units from upstream
|
||||
* [02c716f] d/p/31_check_mailq_separate_submission_queue: Fix filename
|
||||
|
||||
-- Jan Wagner <waja@cyconet.org> Mon, 12 Jun 2023 21:46:29 +0200
|
||||
-- Jan Wagner <waja@cyconet.org> Thu, 30 Mar 2023 09:33:25 +0000
|
||||
|
||||
monitoring-plugins (2.3.3-5) unstable; urgency=medium
|
||||
|
||||
|
|
166
debian/patches/10_check_http_chunked_wo_actual_content
vendored
Normal file
166
debian/patches/10_check_http_chunked_wo_actual_content
vendored
Normal file
|
@ -0,0 +1,166 @@
|
|||
From 6d3e44d2d8395076060e9c741e9b173dc5d57b76 Mon Sep 17 00:00:00 2001
|
||||
From: RincewindsHat <12514511+RincewindsHat@users.noreply.github.com>
|
||||
Date: Mon, 6 Feb 2023 11:39:44 +0100
|
||||
Subject: [PATCH 1/2] check_http: Handle chunked encoding without actual
|
||||
content correctly
|
||||
|
||||
---
|
||||
plugins/check_http.c | 8 +++++++-
|
||||
1 file changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/plugins/check_http.c b/plugins/check_http.c
|
||||
index 5fa310f5d..8dda046ff 100644
|
||||
--- a/plugins/check_http.c
|
||||
+++ b/plugins/check_http.c
|
||||
@@ -1462,7 +1462,13 @@ char *unchunk_content(const char *content) {
|
||||
memcpy(result + (overall_size - size_of_chunk), start_of_chunk, size_of_chunk);
|
||||
}
|
||||
|
||||
- result[overall_size] = '\0';
|
||||
+ if (overall_size == 0 && result == NULL) {
|
||||
+ // We might just have received the end chunk without previous content, so result is never allocated
|
||||
+ result = calloc(1, sizeof(char));
|
||||
+ // No error handling here, we can only return NULL anyway
|
||||
+ } else {
|
||||
+ result[overall_size] = '\0';
|
||||
+ }
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
From 03efbb8e4f736bf2df5d9477dd4191501fe035ea Mon Sep 17 00:00:00 2001
|
||||
From: RincewindsHat <12514511+RincewindsHat@users.noreply.github.com>
|
||||
Date: Mon, 6 Feb 2023 12:15:46 +0100
|
||||
Subject: [PATCH 2/2] check_http: Implement special case test for zero size
|
||||
chunk only
|
||||
|
||||
---
|
||||
plugins/tests/check_http.t | 70 +++++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 69 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/plugins/tests/check_http.t b/plugins/tests/check_http.t
|
||||
index d766ac372..6078b2745 100755
|
||||
--- a/plugins/tests/check_http.t
|
||||
+++ b/plugins/tests/check_http.t
|
||||
@@ -9,12 +9,14 @@ use strict;
|
||||
use Test::More;
|
||||
use NPTest;
|
||||
use FindBin qw($Bin);
|
||||
+use IO::Socket::INET;
|
||||
|
||||
$ENV{'LC_TIME'} = "C";
|
||||
|
||||
my $common_tests = 71;
|
||||
my $virtual_port_tests = 8;
|
||||
my $ssl_only_tests = 12;
|
||||
+my $chunked_encoding_special_tests = 1;
|
||||
# Check that all dependent modules are available
|
||||
eval "use HTTP::Daemon 6.01;";
|
||||
plan skip_all => 'HTTP::Daemon >= 6.01 required' if $@;
|
||||
@@ -30,7 +32,7 @@ if ($@) {
|
||||
plan skip_all => "Missing required module for test: $@";
|
||||
} else {
|
||||
if (-x "./$plugin") {
|
||||
- plan tests => $common_tests * 2 + $ssl_only_tests + $virtual_port_tests;
|
||||
+ plan tests => $common_tests * 2 + $ssl_only_tests + $virtual_port_tests + $chunked_encoding_special_tests;
|
||||
} else {
|
||||
plan skip_all => "No $plugin compiled";
|
||||
}
|
||||
@@ -51,6 +53,7 @@ my $port_http = 50000 + int(rand(1000));
|
||||
my $port_https = $port_http + 1;
|
||||
my $port_https_expired = $port_http + 2;
|
||||
my $port_https_clientcert = $port_http + 3;
|
||||
+my $port_hacked_http = $port_http + 4;
|
||||
|
||||
# This array keeps sockets around for implementing timeouts
|
||||
my @persist;
|
||||
@@ -72,6 +75,28 @@ if (!$pid) {
|
||||
}
|
||||
push @pids, $pid;
|
||||
|
||||
+# Fork the hacked HTTP server
|
||||
+undef $pid;
|
||||
+$pid = fork;
|
||||
+defined $pid or die "Failed to fork";
|
||||
+if (!$pid) {
|
||||
+ # this is the fork
|
||||
+ undef @pids;
|
||||
+ my $socket = new IO::Socket::INET (
|
||||
+ LocalHost => '0.0.0.0',
|
||||
+ LocalPort => $port_hacked_http,
|
||||
+ Proto => 'tcp',
|
||||
+ Listen => 5,
|
||||
+ Reuse => 1
|
||||
+ );
|
||||
+ die "cannot create socket $!n" unless $socket;
|
||||
+ my $local_sock = $socket->sockport();
|
||||
+ print "server waiting for client connection on port $local_sock\n";
|
||||
+ run_hacked_http_server ( $socket );
|
||||
+ die "hacked http server stopped";
|
||||
+}
|
||||
+push @pids, $pid;
|
||||
+
|
||||
if (exists $servers->{https}) {
|
||||
# Fork a normal HTTPS server
|
||||
$pid = fork;
|
||||
@@ -207,6 +232,37 @@ sub run_server {
|
||||
}
|
||||
}
|
||||
|
||||
+sub run_hacked_http_server {
|
||||
+ my $socket = shift;
|
||||
+
|
||||
+ # auto-flush on socket
|
||||
+ $| = 1;
|
||||
+
|
||||
+
|
||||
+ while(1)
|
||||
+ {
|
||||
+ # waiting for a new client connection
|
||||
+ my $client_socket = $socket->accept();
|
||||
+
|
||||
+ # get information about a newly connected client
|
||||
+ my $client_address = $client_socket->peerhost();
|
||||
+ my $client_portn = $client_socket->peerport();
|
||||
+ print "connection from $client_address:$client_portn";
|
||||
+
|
||||
+ # read up to 1024 characters from the connected client
|
||||
+ my $data = "";
|
||||
+ $client_socket->recv($data, 1024);
|
||||
+ print "received data: $data";
|
||||
+
|
||||
+ # write response data to the connected client
|
||||
+ $data = "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n0\r\n\r\n";
|
||||
+ $client_socket->send($data);
|
||||
+
|
||||
+ # notify client that response has been sent
|
||||
+ shutdown($client_socket, 1);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
END {
|
||||
foreach my $pid (@pids) {
|
||||
if ($pid) { print "Killing $pid\n"; kill "INT", $pid }
|
||||
@@ -222,6 +278,7 @@ if ($ARGV[0] && $ARGV[0] eq "-d") {
|
||||
my $result;
|
||||
my $command = "./$plugin -H 127.0.0.1";
|
||||
|
||||
+run_chunked_encoding_special_test( {command => "$command -p $port_hacked_http"});
|
||||
run_common_tests( { command => "$command -p $port_http" } );
|
||||
SKIP: {
|
||||
skip "HTTP::Daemon::SSL not installed", $common_tests + $ssl_only_tests if ! exists $servers->{https};
|
||||
@@ -511,3 +568,14 @@ sub run_common_tests {
|
||||
};
|
||||
is( $@, "", $cmd );
|
||||
}
|
||||
+
|
||||
+sub run_chunked_encoding_special_test {
|
||||
+ my ($opts) = @_;
|
||||
+ my $command = $opts->{command};
|
||||
+
|
||||
+ $cmd = "$command -u / -s 'ChunkedEncodingSpecialTest'";
|
||||
+ eval {
|
||||
+ $result = NPTest->testCmd( $cmd, 5 );
|
||||
+ };
|
||||
+ is( $@, "", $cmd );
|
||||
+}
|
62
debian/patches/11_fallback_for_gnutls
vendored
Normal file
62
debian/patches/11_fallback_for_gnutls
vendored
Normal file
|
@ -0,0 +1,62 @@
|
|||
From 6f0ce3804a396ce89c09f50123e5f31b5b525b31 Mon Sep 17 00:00:00 2001
|
||||
From: Andreas Baumann <mail@andreasbaumann.cc>
|
||||
Date: Sat, 4 Feb 2023 16:19:46 +0100
|
||||
Subject: [PATCH 1/2] fallback to SSL_CTX_use_certificate_file for gnutls
|
||||
|
||||
---
|
||||
plugins/sslutils.c | 13 ++++++++++++-
|
||||
1 file changed, 12 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/plugins/sslutils.c b/plugins/sslutils.c
|
||||
index 286273f61..d542c499f 100644
|
||||
--- a/plugins/sslutils.c
|
||||
+++ b/plugins/sslutils.c
|
||||
@@ -134,7 +134,18 @@ int np_net_ssl_init_with_hostname_version_and_cert(int sd, char *host_name, int
|
||||
return STATE_CRITICAL;
|
||||
}
|
||||
if (cert && privkey) {
|
||||
- SSL_CTX_use_certificate_chain_file(c, cert);
|
||||
+#ifdef USE_OPENSSL
|
||||
+ if (!SSL_CTX_use_certificate_chain_file(c, cert)) {
|
||||
+#else
|
||||
+#if USE_GNUTLS
|
||||
+ if (!SSL_CTX_use_certificate_file(c, cert, SSL_FILETYPE_PEM)) {
|
||||
+#else
|
||||
+#error Unported for unknown SSL library
|
||||
+#endif
|
||||
+#endif
|
||||
+ printf ("%s\n", _("CRITICAL - Unable to open certificate chain file!\n"));
|
||||
+ return STATE_CRITICAL;
|
||||
+ }
|
||||
SSL_CTX_use_PrivateKey_file(c, privkey, SSL_FILETYPE_PEM);
|
||||
#ifdef USE_OPENSSL
|
||||
if (!SSL_CTX_check_private_key(c)) {
|
||||
|
||||
From 28b5a1cc454774474b98037acd283a1da4c3f7ad Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Lorenz=20K=C3=A4stle?=
|
||||
<12514511+RincewindsHat@users.noreply.github.com>
|
||||
Date: Thu, 9 Feb 2023 00:35:20 +0100
|
||||
Subject: [PATCH 2/2] Make preprocessor fallback for gnutls more readable
|
||||
|
||||
---
|
||||
plugins/sslutils.c | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
diff --git a/plugins/sslutils.c b/plugins/sslutils.c
|
||||
index d542c499f..a7d801963 100644
|
||||
--- a/plugins/sslutils.c
|
||||
+++ b/plugins/sslutils.c
|
||||
@@ -136,12 +136,10 @@ int np_net_ssl_init_with_hostname_version_and_cert(int sd, char *host_name, int
|
||||
if (cert && privkey) {
|
||||
#ifdef USE_OPENSSL
|
||||
if (!SSL_CTX_use_certificate_chain_file(c, cert)) {
|
||||
-#else
|
||||
-#if USE_GNUTLS
|
||||
+#elif USE_GNUTLS
|
||||
if (!SSL_CTX_use_certificate_file(c, cert, SSL_FILETYPE_PEM)) {
|
||||
#else
|
||||
#error Unported for unknown SSL library
|
||||
-#endif
|
||||
#endif
|
||||
printf ("%s\n", _("CRITICAL - Unable to open certificate chain file!\n"));
|
||||
return STATE_CRITICAL;
|
906
debian/patches/12_check_curl_improvements
vendored
Normal file
906
debian/patches/12_check_curl_improvements
vendored
Normal file
|
@ -0,0 +1,906 @@
|
|||
From 53f07a468db98247dc4012de0ee678f29cc2bfec Mon Sep 17 00:00:00 2001
|
||||
From: Andreas Baumann <mail@andreasbaumann.cc>
|
||||
Date: Sun, 5 Feb 2023 20:34:41 +0100
|
||||
Subject: [PATCH 1/7] using CURLOPT_REDIR_PROTOCOLS_STR instead of
|
||||
CURLOPT_REDIR_PROTOCOLS for curl >= 7.85.0
|
||||
|
||||
---
|
||||
plugins/check_curl.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/plugins/check_curl.c b/plugins/check_curl.c
|
||||
index c6593df1a..7916eb55a 100644
|
||||
--- a/plugins/check_curl.c
|
||||
+++ b/plugins/check_curl.c
|
||||
@@ -688,9 +688,13 @@ check_http (void)
|
||||
handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_MAXREDIRS, max_depth+1), "CURLOPT_MAXREDIRS");
|
||||
|
||||
/* for now allow only http and https (we are a http(s) check plugin in the end) */
|
||||
+#if LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 85, 0)
|
||||
+ handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_REDIR_PROTOCOLS_STR, "http,https"), "CURLOPT_REDIR_PROTOCOLS_STR");
|
||||
+#else
|
||||
#if LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 19, 4)
|
||||
handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS), "CURLOPT_REDIRECT_PROTOCOLS");
|
||||
#endif /* LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 19, 4) */
|
||||
+#endif /* LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 85, 4) */
|
||||
|
||||
/* TODO: handle the following aspects of redirection, make them
|
||||
* command line options too later:
|
||||
|
||||
From 27b0c6964559ba60ff6c7a626d51e62e5256ed62 Mon Sep 17 00:00:00 2001
|
||||
From: Andreas Baumann <mail@andreasbaumann.cc>
|
||||
Date: Sat, 11 Feb 2023 18:39:24 +0100
|
||||
Subject: [PATCH 2/7] fixed regerror is MAX_INPUT_BUFFER writting into too
|
||||
small errbuf
|
||||
|
||||
---
|
||||
plugins/check_curl.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/plugins/check_curl.c b/plugins/check_curl.c
|
||||
index 7916eb55a..406f6f884 100644
|
||||
--- a/plugins/check_curl.c
|
||||
+++ b/plugins/check_curl.c
|
||||
@@ -173,7 +173,7 @@ double time_connect;
|
||||
double time_appconnect;
|
||||
double time_headers;
|
||||
double time_firstbyte;
|
||||
-char errbuf[CURL_ERROR_SIZE+1];
|
||||
+char errbuf[MAX_INPUT_BUFFER];
|
||||
CURLcode res;
|
||||
char url[DEFAULT_BUFFER_SIZE];
|
||||
char msg[DEFAULT_BUFFER_SIZE];
|
||||
|
||||
From f6978deaa1bf7c6a7196363104ebfcef143080ab Mon Sep 17 00:00:00 2001
|
||||
From: Andreas Baumann <mail@andreasbaumann.cc>
|
||||
Date: Sat, 11 Feb 2023 19:11:07 +0100
|
||||
Subject: [PATCH 3/7] added --cookie-jar and doing proper cleanup of libcurl
|
||||
|
||||
---
|
||||
plugins/check_curl.c | 47 ++++++++++++++++++++++++++++++++------------
|
||||
1 file changed, 34 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/plugins/check_curl.c b/plugins/check_curl.c
|
||||
index 406f6f884..35d1237b8 100644
|
||||
--- a/plugins/check_curl.c
|
||||
+++ b/plugins/check_curl.c
|
||||
@@ -214,6 +214,7 @@ int address_family = AF_UNSPEC;
|
||||
curlhelp_ssl_library ssl_library = CURLHELP_SSL_LIBRARY_UNKNOWN;
|
||||
int curl_http_version = CURL_HTTP_VERSION_NONE;
|
||||
int automatic_decompression = FALSE;
|
||||
+char *cookie_jar_file = NULL;
|
||||
|
||||
int process_arguments (int, char**);
|
||||
void handle_curl_option_return_code (CURLcode res, const char* option);
|
||||
@@ -412,6 +413,19 @@ lookup_host (const char *host, char *buf, size_t buflen)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static void
|
||||
+cleanup (void)
|
||||
+{
|
||||
+ curlhelp_free_statusline(&status_line);
|
||||
+ curl_easy_cleanup (curl);
|
||||
+ curl_global_cleanup ();
|
||||
+ curlhelp_freewritebuffer (&body_buf);
|
||||
+ curlhelp_freewritebuffer (&header_buf);
|
||||
+ if (!strcmp (http_method, "PUT")) {
|
||||
+ curlhelp_freereadbuffer (&put_buf);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
int
|
||||
check_http (void)
|
||||
{
|
||||
@@ -743,7 +757,16 @@ check_http (void)
|
||||
handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_INFILESIZE, (curl_off_t)strlen (http_post_data)), "CURLOPT_INFILESIZE");
|
||||
}
|
||||
}
|
||||
+
|
||||
+ /* cookie handling */
|
||||
+ if (cookie_jar_file != NULL) {
|
||||
+ handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_COOKIEJAR, cookie_jar_file), "CURLOPT_COOKIEJAR");
|
||||
+ handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_COOKIEFILE, cookie_jar_file), "CURLOPT_COOKIEFILE");
|
||||
+ }
|
||||
|
||||
+ /* register cleanup function to shut down libcurl properly */
|
||||
+ atexit (cleanup);
|
||||
+
|
||||
/* do the request */
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
@@ -1021,7 +1044,7 @@ check_http (void)
|
||||
else
|
||||
msg[strlen(msg)-3] = '\0';
|
||||
}
|
||||
-
|
||||
+
|
||||
/* TODO: separate _() msg and status code: die (result, "HTTP %s: %s\n", state_text(result), msg); */
|
||||
die (result, "HTTP %s: %s %d %s%s%s - %d bytes in %.3f second response time %s|%s\n%s%s",
|
||||
state_text(result), string_statuscode (status_line.http_major, status_line.http_minor),
|
||||
@@ -1033,16 +1056,6 @@ check_http (void)
|
||||
(show_body ? body_buf.buf : ""),
|
||||
(show_body ? "\n" : "") );
|
||||
|
||||
- /* proper cleanup after die? */
|
||||
- curlhelp_free_statusline(&status_line);
|
||||
- curl_easy_cleanup (curl);
|
||||
- curl_global_cleanup ();
|
||||
- curlhelp_freewritebuffer (&body_buf);
|
||||
- curlhelp_freewritebuffer (&header_buf);
|
||||
- if (!strcmp (http_method, "PUT")) {
|
||||
- curlhelp_freereadbuffer (&put_buf);
|
||||
- }
|
||||
-
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -1239,7 +1252,8 @@ process_arguments (int argc, char **argv)
|
||||
CONTINUE_AFTER_CHECK_CERT,
|
||||
CA_CERT_OPTION,
|
||||
HTTP_VERSION_OPTION,
|
||||
- AUTOMATIC_DECOMPRESSION
|
||||
+ AUTOMATIC_DECOMPRESSION,
|
||||
+ COOKIE_JAR
|
||||
};
|
||||
|
||||
int option = 0;
|
||||
@@ -1285,6 +1299,7 @@ process_arguments (int argc, char **argv)
|
||||
{"max-redirs", required_argument, 0, MAX_REDIRS_OPTION},
|
||||
{"http-version", required_argument, 0, HTTP_VERSION_OPTION},
|
||||
{"enable-automatic-decompression", no_argument, 0, AUTOMATIC_DECOMPRESSION},
|
||||
+ {"cookie-jar", required_argument, 0, COOKIE_JAR},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
@@ -1691,6 +1706,9 @@ process_arguments (int argc, char **argv)
|
||||
case AUTOMATIC_DECOMPRESSION:
|
||||
automatic_decompression = TRUE;
|
||||
break;
|
||||
+ case COOKIE_JAR:
|
||||
+ cookie_jar_file = optarg;
|
||||
+ break;
|
||||
case '?':
|
||||
/* print short usage statement if args not parsable */
|
||||
usage5 ();
|
||||
@@ -1910,6 +1928,8 @@ print_help (void)
|
||||
printf (" %s\n", _("1.0 = HTTP/1.0, 1.1 = HTTP/1.1, 2.0 = HTTP/2 (HTTP/2 will fail without -S)"));
|
||||
printf (" %s\n", "--enable-automatic-decompression");
|
||||
printf (" %s\n", _("Enable automatic decompression of body (CURLOPT_ACCEPT_ENCODING)."));
|
||||
+ printf (" %s\n", "---cookie-jar=FILE");
|
||||
+ printf (" %s\n", _("Store cookies in the cookie jar and send them out when requested."));
|
||||
printf ("\n");
|
||||
|
||||
printf (UT_WARN_CRIT);
|
||||
@@ -1994,7 +2014,8 @@ print_usage (void)
|
||||
printf (" [-P string] [-m <min_pg_size>:<max_pg_size>] [-4|-6] [-N] [-M <age>]\n");
|
||||
printf (" [-A string] [-k string] [-S <version>] [--sni]\n");
|
||||
printf (" [-T <content-type>] [-j method]\n");
|
||||
- printf (" [--http-version=<version>]\n");
|
||||
+ printf (" [--http-version=<version>] [--enable-automatic-decompression]\n");
|
||||
+ printf (" [--cookie-jar=<cookie jar file>\n");
|
||||
printf (" %s -H <vhost> | -I <IP-address> -C <warn_age>[,<crit_age>]\n",progname);
|
||||
printf (" [-p <port>] [-t <timeout>] [-4|-6] [--sni]\n");
|
||||
printf ("\n");
|
||||
|
||||
From 40da85e6913ba4898f5a80772c7b3ea0cba0d3eb Mon Sep 17 00:00:00 2001
|
||||
From: Andreas Baumann <mail@andreasbaumann.cc>
|
||||
Date: Sun, 12 Feb 2023 12:11:38 +0100
|
||||
Subject: [PATCH 4/7] better cleanup of curl structures and buffers
|
||||
|
||||
---
|
||||
plugins/check_curl.c | 31 ++++++++++++++++++++-----------
|
||||
1 file changed, 20 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/plugins/check_curl.c b/plugins/check_curl.c
|
||||
index 35d1237b8..a49cac8a3 100644
|
||||
--- a/plugins/check_curl.c
|
||||
+++ b/plugins/check_curl.c
|
||||
@@ -161,9 +161,13 @@ char *http_post_data = NULL;
|
||||
char *http_content_type = NULL;
|
||||
CURL *curl;
|
||||
struct curl_slist *header_list = NULL;
|
||||
+int body_buf_initialized = 0;
|
||||
curlhelp_write_curlbuf body_buf;
|
||||
+int header_buf_initialized = 0;
|
||||
curlhelp_write_curlbuf header_buf;
|
||||
+int status_line_initialized = 0;
|
||||
curlhelp_statusline status_line;
|
||||
+int put_buf_initialized = 0;
|
||||
curlhelp_read_curlbuf put_buf;
|
||||
char http_header[DEFAULT_BUFFER_SIZE];
|
||||
long code;
|
||||
@@ -416,14 +420,12 @@ lookup_host (const char *host, char *buf, size_t buflen)
|
||||
static void
|
||||
cleanup (void)
|
||||
{
|
||||
- curlhelp_free_statusline(&status_line);
|
||||
+ if (status_line_initialized) curlhelp_free_statusline(&status_line);
|
||||
curl_easy_cleanup (curl);
|
||||
curl_global_cleanup ();
|
||||
- curlhelp_freewritebuffer (&body_buf);
|
||||
- curlhelp_freewritebuffer (&header_buf);
|
||||
- if (!strcmp (http_method, "PUT")) {
|
||||
- curlhelp_freereadbuffer (&put_buf);
|
||||
- }
|
||||
+ if (body_buf_initialized) curlhelp_freewritebuffer (&body_buf);
|
||||
+ if (header_buf_initialized) curlhelp_freewritebuffer (&header_buf);
|
||||
+ if (put_buf_initialized) curlhelp_freereadbuffer (&put_buf);
|
||||
}
|
||||
|
||||
int
|
||||
@@ -441,9 +443,14 @@ check_http (void)
|
||||
if (curl_global_init (CURL_GLOBAL_DEFAULT) != CURLE_OK)
|
||||
die (STATE_UNKNOWN, "HTTP UNKNOWN - curl_global_init failed\n");
|
||||
|
||||
- if ((curl = curl_easy_init()) == NULL)
|
||||
+ if ((curl = curl_easy_init()) == NULL) {
|
||||
+ curl_global_cleanup ();
|
||||
die (STATE_UNKNOWN, "HTTP UNKNOWN - curl_easy_init failed\n");
|
||||
+ }
|
||||
|
||||
+ /* register cleanup function to shut down libcurl properly */
|
||||
+ atexit (cleanup);
|
||||
+
|
||||
if (verbose >= 1)
|
||||
handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_VERBOSE, TRUE), "CURLOPT_VERBOSE");
|
||||
|
||||
@@ -460,12 +467,14 @@ check_http (void)
|
||||
/* initialize buffer for body of the answer */
|
||||
if (curlhelp_initwritebuffer(&body_buf) < 0)
|
||||
die (STATE_UNKNOWN, "HTTP CRITICAL - out of memory allocating buffer for body\n");
|
||||
+ body_buf_initialized = 1;
|
||||
handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, (curl_write_callback)curlhelp_buffer_write_callback), "CURLOPT_WRITEFUNCTION");
|
||||
handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_WRITEDATA, (void *)&body_buf), "CURLOPT_WRITEDATA");
|
||||
|
||||
/* initialize buffer for header of the answer */
|
||||
if (curlhelp_initwritebuffer( &header_buf ) < 0)
|
||||
die (STATE_UNKNOWN, "HTTP CRITICAL - out of memory allocating buffer for header\n" );
|
||||
+ header_buf_initialized = 1;
|
||||
handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_HEADERFUNCTION, (curl_write_callback)curlhelp_buffer_write_callback), "CURLOPT_HEADERFUNCTION");
|
||||
handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_WRITEHEADER, (void *)&header_buf), "CURLOPT_WRITEHEADER");
|
||||
|
||||
@@ -752,7 +761,9 @@ check_http (void)
|
||||
handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_POSTFIELDS, http_post_data), "CURLOPT_POSTFIELDS");
|
||||
} else if (!strcmp(http_method, "PUT")) {
|
||||
handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_READFUNCTION, (curl_read_callback)curlhelp_buffer_read_callback), "CURLOPT_READFUNCTION");
|
||||
- curlhelp_initreadbuffer (&put_buf, http_post_data, strlen (http_post_data));
|
||||
+ if (curlhelp_initreadbuffer (&put_buf, http_post_data, strlen (http_post_data)) < 0)
|
||||
+ die (STATE_UNKNOWN, "HTTP CRITICAL - out of memory allocating read buffer for PUT\n");
|
||||
+ put_buf_initialized = 1;
|
||||
handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_READDATA, (void *)&put_buf), "CURLOPT_READDATA");
|
||||
handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_INFILESIZE, (curl_off_t)strlen (http_post_data)), "CURLOPT_INFILESIZE");
|
||||
}
|
||||
@@ -764,9 +775,6 @@ check_http (void)
|
||||
handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_COOKIEFILE, cookie_jar_file), "CURLOPT_COOKIEFILE");
|
||||
}
|
||||
|
||||
- /* register cleanup function to shut down libcurl properly */
|
||||
- atexit (cleanup);
|
||||
-
|
||||
/* do the request */
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
@@ -2159,6 +2167,7 @@ curlhelp_parse_statusline (const char *buf, curlhelp_statusline *status_line)
|
||||
|
||||
first_line_len = (size_t)(first_line_end - buf);
|
||||
status_line->first_line = (char *)malloc (first_line_len + 1);
|
||||
+ status_line_initialized = 1;
|
||||
if (status_line->first_line == NULL) return -1;
|
||||
memcpy (status_line->first_line, buf, first_line_len);
|
||||
status_line->first_line[first_line_len] = '\0';
|
||||
|
||||
From 6563267c3ad84bcc4779d282b5ae20520a4a2a6b Mon Sep 17 00:00:00 2001
|
||||
From: Andreas Baumann <mail@andreasbaumann.cc>
|
||||
Date: Sun, 12 Feb 2023 13:16:25 +0100
|
||||
Subject: [PATCH 5/7] fixed double frees when doing old-style redirects
|
||||
|
||||
---
|
||||
plugins/check_curl.c | 18 ++++++++++++++----
|
||||
1 file changed, 14 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/plugins/check_curl.c b/plugins/check_curl.c
|
||||
index a49cac8a3..1127d6019 100644
|
||||
--- a/plugins/check_curl.c
|
||||
+++ b/plugins/check_curl.c
|
||||
@@ -160,6 +160,8 @@ char *http_method = NULL;
|
||||
char *http_post_data = NULL;
|
||||
char *http_content_type = NULL;
|
||||
CURL *curl;
|
||||
+int curl_global_initialized = 0;
|
||||
+int curl_easy_initialized = 0;
|
||||
struct curl_slist *header_list = NULL;
|
||||
int body_buf_initialized = 0;
|
||||
curlhelp_write_curlbuf body_buf;
|
||||
@@ -421,11 +423,17 @@ static void
|
||||
cleanup (void)
|
||||
{
|
||||
if (status_line_initialized) curlhelp_free_statusline(&status_line);
|
||||
- curl_easy_cleanup (curl);
|
||||
- curl_global_cleanup ();
|
||||
+ status_line_initialized = 0;
|
||||
+ if (curl_easy_initialized) curl_easy_cleanup (curl);
|
||||
+ curl_easy_initialized = 0;
|
||||
+ if (curl_global_initialized) curl_global_cleanup ();
|
||||
+ curl_global_initialized = 0;
|
||||
if (body_buf_initialized) curlhelp_freewritebuffer (&body_buf);
|
||||
+ body_buf_initialized = 0;
|
||||
if (header_buf_initialized) curlhelp_freewritebuffer (&header_buf);
|
||||
+ header_buf_initialized = 0;
|
||||
if (put_buf_initialized) curlhelp_freereadbuffer (&put_buf);
|
||||
+ put_buf_initialized = 0;
|
||||
}
|
||||
|
||||
int
|
||||
@@ -442,11 +450,12 @@ check_http (void)
|
||||
/* initialize curl */
|
||||
if (curl_global_init (CURL_GLOBAL_DEFAULT) != CURLE_OK)
|
||||
die (STATE_UNKNOWN, "HTTP UNKNOWN - curl_global_init failed\n");
|
||||
+ curl_global_initialized = 1;
|
||||
|
||||
if ((curl = curl_easy_init()) == NULL) {
|
||||
- curl_global_cleanup ();
|
||||
die (STATE_UNKNOWN, "HTTP UNKNOWN - curl_easy_init failed\n");
|
||||
}
|
||||
+ curl_easy_initialized = 1;
|
||||
|
||||
/* register cleanup function to shut down libcurl properly */
|
||||
atexit (cleanup);
|
||||
@@ -903,6 +912,7 @@ check_http (void)
|
||||
/* we cannot know the major/minor version here for sure as we cannot parse the first line */
|
||||
die (STATE_CRITICAL, "HTTP CRITICAL HTTP/x.x %ld unknown - %s", code, msg);
|
||||
}
|
||||
+ status_line_initialized = 1;
|
||||
|
||||
/* get result code from cURL */
|
||||
handle_curl_option_return_code (curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &code), "CURLINFO_RESPONSE_CODE");
|
||||
@@ -1234,6 +1244,7 @@ redir (curlhelp_write_curlbuf* header_buf)
|
||||
* attached to the URL in Location
|
||||
*/
|
||||
|
||||
+ cleanup ();
|
||||
check_http ();
|
||||
}
|
||||
|
||||
@@ -2167,7 +2178,6 @@ curlhelp_parse_statusline (const char *buf, curlhelp_statusline *status_line)
|
||||
|
||||
first_line_len = (size_t)(first_line_end - buf);
|
||||
status_line->first_line = (char *)malloc (first_line_len + 1);
|
||||
- status_line_initialized = 1;
|
||||
if (status_line->first_line == NULL) return -1;
|
||||
memcpy (status_line->first_line, buf, first_line_len);
|
||||
status_line->first_line[first_line_len] = '\0';
|
||||
|
||||
From 8e1bbf5e6ed4069d4256bf549a408bb8759861fa Mon Sep 17 00:00:00 2001
|
||||
From: Andreas Baumann <mail@andreasbaumann.cc>
|
||||
Date: Sun, 12 Feb 2023 15:09:02 +0100
|
||||
Subject: [PATCH 6/7] changed #else/#if to #elif in libcurl library checks
|
||||
|
||||
---
|
||||
plugins/check_curl.c | 6 ++----
|
||||
1 file changed, 2 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/plugins/check_curl.c b/plugins/check_curl.c
|
||||
index 1127d6019..284cf4eab 100644
|
||||
--- a/plugins/check_curl.c
|
||||
+++ b/plugins/check_curl.c
|
||||
@@ -722,11 +722,9 @@ check_http (void)
|
||||
/* for now allow only http and https (we are a http(s) check plugin in the end) */
|
||||
#if LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 85, 0)
|
||||
handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_REDIR_PROTOCOLS_STR, "http,https"), "CURLOPT_REDIR_PROTOCOLS_STR");
|
||||
-#else
|
||||
-#if LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 19, 4)
|
||||
+#elif LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 19, 4)
|
||||
handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS), "CURLOPT_REDIRECT_PROTOCOLS");
|
||||
-#endif /* LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 19, 4) */
|
||||
-#endif /* LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 85, 4) */
|
||||
+#endif
|
||||
|
||||
/* TODO: handle the following aspects of redirection, make them
|
||||
* command line options too later:
|
||||
|
||||
From ad6b638acb420f4416b10cf52fdd6c75c3c8e6fa Mon Sep 17 00:00:00 2001
|
||||
From: Andreas Baumann <mail@andreasbaumann.cc>
|
||||
Date: Fri, 17 Feb 2023 14:03:55 +0100
|
||||
Subject: [PATCH 7/7] using real boolean in check_curl
|
||||
|
||||
---
|
||||
plugins/check_curl.c | 160 ++++++++++++++++++++++---------------------
|
||||
1 file changed, 82 insertions(+), 78 deletions(-)
|
||||
|
||||
diff --git a/plugins/check_curl.c b/plugins/check_curl.c
|
||||
index 284cf4eab..c37d45d91 100644
|
||||
--- a/plugins/check_curl.c
|
||||
+++ b/plugins/check_curl.c
|
||||
@@ -37,6 +37,7 @@ const char *progname = "check_curl";
|
||||
const char *copyright = "2006-2019";
|
||||
const char *email = "devel@monitoring-plugins.org";
|
||||
|
||||
+#include <stdbool.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include "common.h"
|
||||
@@ -131,14 +132,14 @@ regmatch_t pmatch[REGS];
|
||||
char regexp[MAX_RE_SIZE];
|
||||
int cflags = REG_NOSUB | REG_EXTENDED | REG_NEWLINE;
|
||||
int errcode;
|
||||
-int invert_regex = 0;
|
||||
+bool invert_regex = false;
|
||||
|
||||
char *server_address = NULL;
|
||||
char *host_name = NULL;
|
||||
char *server_url = 0;
|
||||
char server_ip[DEFAULT_BUFFER_SIZE];
|
||||
struct curl_slist *server_ips = NULL;
|
||||
-int specify_port = FALSE;
|
||||
+bool specify_port = false;
|
||||
unsigned short server_port = HTTP_PORT;
|
||||
unsigned short virtual_port = 0;
|
||||
int host_name_length;
|
||||
@@ -150,8 +151,8 @@ int days_till_exp_warn, days_till_exp_crit;
|
||||
thresholds *thlds;
|
||||
char user_agent[DEFAULT_BUFFER_SIZE];
|
||||
int verbose = 0;
|
||||
-int show_extended_perfdata = FALSE;
|
||||
-int show_body = FALSE;
|
||||
+bool show_extended_perfdata = false;
|
||||
+bool show_body = false;
|
||||
int min_page_len = 0;
|
||||
int max_page_len = 0;
|
||||
int redir_depth = 0;
|
||||
@@ -160,16 +161,16 @@ char *http_method = NULL;
|
||||
char *http_post_data = NULL;
|
||||
char *http_content_type = NULL;
|
||||
CURL *curl;
|
||||
-int curl_global_initialized = 0;
|
||||
-int curl_easy_initialized = 0;
|
||||
+bool curl_global_initialized = false;
|
||||
+bool curl_easy_initialized = false;
|
||||
struct curl_slist *header_list = NULL;
|
||||
-int body_buf_initialized = 0;
|
||||
+bool body_buf_initialized = false;
|
||||
curlhelp_write_curlbuf body_buf;
|
||||
-int header_buf_initialized = 0;
|
||||
+bool header_buf_initialized = false;
|
||||
curlhelp_write_curlbuf header_buf;
|
||||
-int status_line_initialized = 0;
|
||||
+bool status_line_initialized = false;
|
||||
curlhelp_statusline status_line;
|
||||
-int put_buf_initialized = 0;
|
||||
+bool put_buf_initialized = false;
|
||||
curlhelp_read_curlbuf put_buf;
|
||||
char http_header[DEFAULT_BUFFER_SIZE];
|
||||
long code;
|
||||
@@ -192,14 +193,14 @@ char user_auth[MAX_INPUT_BUFFER] = "";
|
||||
char proxy_auth[MAX_INPUT_BUFFER] = "";
|
||||
char **http_opt_headers;
|
||||
int http_opt_headers_count = 0;
|
||||
-int display_html = FALSE;
|
||||
+bool display_html = false;
|
||||
int onredirect = STATE_OK;
|
||||
int followmethod = FOLLOW_HTTP_CURL;
|
||||
int followsticky = STICKY_NONE;
|
||||
-int use_ssl = FALSE;
|
||||
-int use_sni = TRUE;
|
||||
-int check_cert = FALSE;
|
||||
-int continue_after_check_cert = FALSE;
|
||||
+bool use_ssl = false;
|
||||
+bool use_sni = true;
|
||||
+bool check_cert = false;
|
||||
+bool continue_after_check_cert = false;
|
||||
typedef union {
|
||||
struct curl_slist* to_info;
|
||||
struct curl_certinfo* to_certinfo;
|
||||
@@ -209,20 +210,20 @@ int ssl_version = CURL_SSLVERSION_DEFAULT;
|
||||
char *client_cert = NULL;
|
||||
char *client_privkey = NULL;
|
||||
char *ca_cert = NULL;
|
||||
-int verify_peer_and_host = FALSE;
|
||||
-int is_openssl_callback = FALSE;
|
||||
+bool verify_peer_and_host = false;
|
||||
+bool is_openssl_callback = false;
|
||||
#if defined(HAVE_SSL) && defined(USE_OPENSSL)
|
||||
X509 *cert = NULL;
|
||||
#endif /* defined(HAVE_SSL) && defined(USE_OPENSSL) */
|
||||
-int no_body = FALSE;
|
||||
+bool no_body = false;
|
||||
int maximum_age = -1;
|
||||
int address_family = AF_UNSPEC;
|
||||
curlhelp_ssl_library ssl_library = CURLHELP_SSL_LIBRARY_UNKNOWN;
|
||||
int curl_http_version = CURL_HTTP_VERSION_NONE;
|
||||
-int automatic_decompression = FALSE;
|
||||
+bool automatic_decompression = false;
|
||||
char *cookie_jar_file = NULL;
|
||||
|
||||
-int process_arguments (int, char**);
|
||||
+bool process_arguments (int, char**);
|
||||
void handle_curl_option_return_code (CURLcode res, const char* option);
|
||||
int check_http (void);
|
||||
void redir (curlhelp_write_curlbuf*);
|
||||
@@ -276,10 +277,10 @@ main (int argc, char **argv)
|
||||
progname, NP_VERSION, VERSION, curl_version());
|
||||
|
||||
/* parse arguments */
|
||||
- if (process_arguments (argc, argv) == ERROR)
|
||||
+ if (process_arguments (argc, argv) == false)
|
||||
usage4 (_("Could not parse arguments"));
|
||||
|
||||
- if (display_html == TRUE)
|
||||
+ if (display_html)
|
||||
printf ("<A HREF=\"%s://%s:%d%s\" target=\"_blank\">",
|
||||
use_ssl ? "https" : "http",
|
||||
host_name ? host_name : server_address,
|
||||
@@ -423,17 +424,17 @@ static void
|
||||
cleanup (void)
|
||||
{
|
||||
if (status_line_initialized) curlhelp_free_statusline(&status_line);
|
||||
- status_line_initialized = 0;
|
||||
+ status_line_initialized = false;
|
||||
if (curl_easy_initialized) curl_easy_cleanup (curl);
|
||||
- curl_easy_initialized = 0;
|
||||
+ curl_easy_initialized = false;
|
||||
if (curl_global_initialized) curl_global_cleanup ();
|
||||
- curl_global_initialized = 0;
|
||||
+ curl_global_initialized = false;
|
||||
if (body_buf_initialized) curlhelp_freewritebuffer (&body_buf);
|
||||
- body_buf_initialized = 0;
|
||||
+ body_buf_initialized = false;
|
||||
if (header_buf_initialized) curlhelp_freewritebuffer (&header_buf);
|
||||
- header_buf_initialized = 0;
|
||||
+ header_buf_initialized = false;
|
||||
if (put_buf_initialized) curlhelp_freereadbuffer (&put_buf);
|
||||
- put_buf_initialized = 0;
|
||||
+ put_buf_initialized = false;
|
||||
}
|
||||
|
||||
int
|
||||
@@ -450,18 +451,18 @@ check_http (void)
|
||||
/* initialize curl */
|
||||
if (curl_global_init (CURL_GLOBAL_DEFAULT) != CURLE_OK)
|
||||
die (STATE_UNKNOWN, "HTTP UNKNOWN - curl_global_init failed\n");
|
||||
- curl_global_initialized = 1;
|
||||
+ curl_global_initialized = true;
|
||||
|
||||
if ((curl = curl_easy_init()) == NULL) {
|
||||
die (STATE_UNKNOWN, "HTTP UNKNOWN - curl_easy_init failed\n");
|
||||
}
|
||||
- curl_easy_initialized = 1;
|
||||
+ curl_easy_initialized = true;
|
||||
|
||||
/* register cleanup function to shut down libcurl properly */
|
||||
atexit (cleanup);
|
||||
|
||||
if (verbose >= 1)
|
||||
- handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_VERBOSE, TRUE), "CURLOPT_VERBOSE");
|
||||
+ handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_VERBOSE, 1), "CURLOPT_VERBOSE");
|
||||
|
||||
/* print everything on stdout like check_http would do */
|
||||
handle_curl_option_return_code (curl_easy_setopt(curl, CURLOPT_STDERR, stdout), "CURLOPT_STDERR");
|
||||
@@ -476,14 +477,14 @@ check_http (void)
|
||||
/* initialize buffer for body of the answer */
|
||||
if (curlhelp_initwritebuffer(&body_buf) < 0)
|
||||
die (STATE_UNKNOWN, "HTTP CRITICAL - out of memory allocating buffer for body\n");
|
||||
- body_buf_initialized = 1;
|
||||
+ body_buf_initialized = true;
|
||||
handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, (curl_write_callback)curlhelp_buffer_write_callback), "CURLOPT_WRITEFUNCTION");
|
||||
handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_WRITEDATA, (void *)&body_buf), "CURLOPT_WRITEDATA");
|
||||
|
||||
/* initialize buffer for header of the answer */
|
||||
if (curlhelp_initwritebuffer( &header_buf ) < 0)
|
||||
die (STATE_UNKNOWN, "HTTP CRITICAL - out of memory allocating buffer for header\n" );
|
||||
- header_buf_initialized = 1;
|
||||
+ header_buf_initialized = true;
|
||||
handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_HEADERFUNCTION, (curl_write_callback)curlhelp_buffer_write_callback), "CURLOPT_HEADERFUNCTION");
|
||||
handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_WRITEHEADER, (void *)&header_buf), "CURLOPT_WRITEHEADER");
|
||||
|
||||
@@ -544,7 +545,7 @@ check_http (void)
|
||||
|
||||
/* disable body for HEAD request */
|
||||
if (http_method && !strcmp (http_method, "HEAD" )) {
|
||||
- no_body = TRUE;
|
||||
+ no_body = true;
|
||||
}
|
||||
|
||||
/* set HTTP protocol version */
|
||||
@@ -641,7 +642,7 @@ check_http (void)
|
||||
#ifdef USE_OPENSSL
|
||||
/* libcurl and monitoring plugins built with OpenSSL, good */
|
||||
handle_curl_option_return_code (curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, sslctxfun), "CURLOPT_SSL_CTX_FUNCTION");
|
||||
- is_openssl_callback = TRUE;
|
||||
+ is_openssl_callback = true;
|
||||
#else /* USE_OPENSSL */
|
||||
#endif /* USE_OPENSSL */
|
||||
/* libcurl is built with OpenSSL, monitoring plugins, so falling
|
||||
@@ -770,7 +771,7 @@ check_http (void)
|
||||
handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_READFUNCTION, (curl_read_callback)curlhelp_buffer_read_callback), "CURLOPT_READFUNCTION");
|
||||
if (curlhelp_initreadbuffer (&put_buf, http_post_data, strlen (http_post_data)) < 0)
|
||||
die (STATE_UNKNOWN, "HTTP CRITICAL - out of memory allocating read buffer for PUT\n");
|
||||
- put_buf_initialized = 1;
|
||||
+ put_buf_initialized = true;
|
||||
handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_READDATA, (void *)&put_buf), "CURLOPT_READDATA");
|
||||
handle_curl_option_return_code (curl_easy_setopt (curl, CURLOPT_INFILESIZE, (curl_off_t)strlen (http_post_data)), "CURLOPT_INFILESIZE");
|
||||
}
|
||||
@@ -801,15 +802,15 @@ check_http (void)
|
||||
|
||||
/* certificate checks */
|
||||
#ifdef LIBCURL_FEATURE_SSL
|
||||
- if (use_ssl == TRUE) {
|
||||
- if (check_cert == TRUE) {
|
||||
+ if (use_ssl) {
|
||||
+ if (check_cert) {
|
||||
if (is_openssl_callback) {
|
||||
#ifdef USE_OPENSSL
|
||||
/* check certificate with OpenSSL functions, curl has been built against OpenSSL
|
||||
* and we actually have OpenSSL in the monitoring tools
|
||||
*/
|
||||
result = np_net_ssl_check_certificate(cert, days_till_exp_warn, days_till_exp_crit);
|
||||
- if (continue_after_check_cert == FALSE) {
|
||||
+ if (!continue_after_check_cert) {
|
||||
return result;
|
||||
}
|
||||
#else /* USE_OPENSSL */
|
||||
@@ -851,7 +852,7 @@ check_http (void)
|
||||
}
|
||||
BIO_free (cert_BIO);
|
||||
result = np_net_ssl_check_certificate(cert, days_till_exp_warn, days_till_exp_crit);
|
||||
- if (continue_after_check_cert == FALSE) {
|
||||
+ if (!continue_after_check_cert) {
|
||||
return result;
|
||||
}
|
||||
#else /* USE_OPENSSL */
|
||||
@@ -859,7 +860,7 @@ check_http (void)
|
||||
* so we use the libcurl CURLINFO data
|
||||
*/
|
||||
result = net_noopenssl_check_certificate(&cert_ptr, days_till_exp_warn, days_till_exp_crit);
|
||||
- if (continue_after_check_cert == FALSE) {
|
||||
+ if (!continue_after_check_cert) {
|
||||
return result;
|
||||
}
|
||||
#endif /* USE_OPENSSL */
|
||||
@@ -887,7 +888,7 @@ check_http (void)
|
||||
perfd_time(total_time),
|
||||
perfd_size(page_len),
|
||||
perfd_time_connect(time_connect),
|
||||
- use_ssl == TRUE ? perfd_time_ssl (time_appconnect-time_connect) : "",
|
||||
+ use_ssl ? perfd_time_ssl (time_appconnect-time_connect) : "",
|
||||
perfd_time_headers(time_headers - time_appconnect),
|
||||
perfd_time_firstbyte(time_firstbyte - time_headers),
|
||||
perfd_time_transfer(total_time-time_firstbyte)
|
||||
@@ -910,7 +911,7 @@ check_http (void)
|
||||
/* we cannot know the major/minor version here for sure as we cannot parse the first line */
|
||||
die (STATE_CRITICAL, "HTTP CRITICAL HTTP/x.x %ld unknown - %s", code, msg);
|
||||
}
|
||||
- status_line_initialized = 1;
|
||||
+ status_line_initialized = true;
|
||||
|
||||
/* get result code from cURL */
|
||||
handle_curl_option_return_code (curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &code), "CURLINFO_RESPONSE_CODE");
|
||||
@@ -1023,12 +1024,12 @@ check_http (void)
|
||||
|
||||
if (strlen (regexp)) {
|
||||
errcode = regexec (&preg, body_buf.buf, REGS, pmatch, 0);
|
||||
- if ((errcode == 0 && invert_regex == 0) || (errcode == REG_NOMATCH && invert_regex == 1)) {
|
||||
+ if ((errcode == 0 && !invert_regex) || (errcode == REG_NOMATCH && invert_regex)) {
|
||||
/* OK - No-op to avoid changing the logic around it */
|
||||
result = max_state_alt(STATE_OK, result);
|
||||
}
|
||||
- else if ((errcode == REG_NOMATCH && invert_regex == 0) || (errcode == 0 && invert_regex == 1)) {
|
||||
- if (invert_regex == 0)
|
||||
+ else if ((errcode == REG_NOMATCH && !invert_regex) || (errcode == 0 && invert_regex)) {
|
||||
+ if (!invert_regex)
|
||||
snprintf (msg, DEFAULT_BUFFER_SIZE, _("%spattern not found, "), msg);
|
||||
else
|
||||
snprintf (msg, DEFAULT_BUFFER_SIZE, _("%spattern found, "), msg);
|
||||
@@ -1167,7 +1168,10 @@ redir (curlhelp_write_curlbuf* header_buf)
|
||||
}
|
||||
}
|
||||
|
||||
- use_ssl = !uri_strcmp (uri.scheme, "https");
|
||||
+ if (!uri_strcmp (uri.scheme, "https"))
|
||||
+ use_ssl = true;
|
||||
+ else
|
||||
+ use_ssl = false;
|
||||
|
||||
/* we do a sloppy test here only, because uriparser would have failed
|
||||
* above, if the port would be invalid, we just check for MAX_PORT
|
||||
@@ -1255,7 +1259,7 @@ test_file (char *path)
|
||||
usage2 (_("file does not exist or is not readable"), path);
|
||||
}
|
||||
|
||||
-int
|
||||
+bool
|
||||
process_arguments (int argc, char **argv)
|
||||
{
|
||||
char *p;
|
||||
@@ -1321,7 +1325,7 @@ process_arguments (int argc, char **argv)
|
||||
};
|
||||
|
||||
if (argc < 2)
|
||||
- return ERROR;
|
||||
+ return false;
|
||||
|
||||
/* support check_http compatible arguments */
|
||||
for (c = 1; c < argc; c++) {
|
||||
@@ -1401,7 +1405,7 @@ process_arguments (int argc, char **argv)
|
||||
if( strtol(optarg, NULL, 10) > MAX_PORT)
|
||||
usage2 (_("Invalid port number, supplied port number is too big"), optarg);
|
||||
server_port = (unsigned short)strtol(optarg, NULL, 10);
|
||||
- specify_port = TRUE;
|
||||
+ specify_port = true;
|
||||
}
|
||||
break;
|
||||
case 'a': /* authorization info */
|
||||
@@ -1435,10 +1439,10 @@ process_arguments (int argc, char **argv)
|
||||
http_opt_headers[http_opt_headers_count - 1] = optarg;
|
||||
break;
|
||||
case 'L': /* show html link */
|
||||
- display_html = TRUE;
|
||||
+ display_html = true;
|
||||
break;
|
||||
case 'n': /* do not show html link */
|
||||
- display_html = FALSE;
|
||||
+ display_html = false;
|
||||
break;
|
||||
case 'C': /* Check SSL cert validity */
|
||||
#ifdef LIBCURL_FEATURE_SSL
|
||||
@@ -1459,12 +1463,12 @@ process_arguments (int argc, char **argv)
|
||||
usage2 (_("Invalid certificate expiration period"), optarg);
|
||||
days_till_exp_warn = atoi (optarg);
|
||||
}
|
||||
- check_cert = TRUE;
|
||||
+ check_cert = true;
|
||||
goto enable_ssl;
|
||||
#endif
|
||||
case CONTINUE_AFTER_CHECK_CERT: /* don't stop after the certificate is checked */
|
||||
#ifdef HAVE_SSL
|
||||
- continue_after_check_cert = TRUE;
|
||||
+ continue_after_check_cert = true;
|
||||
break;
|
||||
#endif
|
||||
case 'J': /* use client certificate */
|
||||
@@ -1487,13 +1491,13 @@ process_arguments (int argc, char **argv)
|
||||
#endif
|
||||
#ifdef LIBCURL_FEATURE_SSL
|
||||
case 'D': /* verify peer certificate & host */
|
||||
- verify_peer_and_host = TRUE;
|
||||
+ verify_peer_and_host = true;
|
||||
break;
|
||||
#endif
|
||||
case 'S': /* use SSL */
|
||||
#ifdef LIBCURL_FEATURE_SSL
|
||||
enable_ssl:
|
||||
- use_ssl = TRUE;
|
||||
+ use_ssl = true;
|
||||
/* ssl_version initialized to CURL_SSLVERSION_DEFAULT as a default.
|
||||
* Only set if it's non-zero. This helps when we include multiple
|
||||
* parameters, like -S and -C combinations */
|
||||
@@ -1567,15 +1571,15 @@ process_arguments (int argc, char **argv)
|
||||
#endif /* LIBCURL_VERSION_NUM >= MAKE_LIBCURL_VERSION(7, 54, 0) */
|
||||
if (verbose >= 2)
|
||||
printf(_("* Set SSL/TLS version to %d\n"), ssl_version);
|
||||
- if (specify_port == FALSE)
|
||||
+ if (!specify_port)
|
||||
server_port = HTTPS_PORT;
|
||||
break;
|
||||
#else /* LIBCURL_FEATURE_SSL */
|
||||
/* -C -J and -K fall through to here without SSL */
|
||||
usage4 (_("Invalid option - SSL is not available"));
|
||||
break;
|
||||
- case SNI_OPTION: /* --sni is parsed, but ignored, the default is TRUE with libcurl */
|
||||
- use_sni = TRUE;
|
||||
+ case SNI_OPTION: /* --sni is parsed, but ignored, the default is true with libcurl */
|
||||
+ use_sni = true;
|
||||
break;
|
||||
#endif /* LIBCURL_FEATURE_SSL */
|
||||
case MAX_REDIRS_OPTION:
|
||||
@@ -1636,11 +1640,11 @@ process_arguments (int argc, char **argv)
|
||||
if (errcode != 0) {
|
||||
(void) regerror (errcode, &preg, errbuf, MAX_INPUT_BUFFER);
|
||||
printf (_("Could Not Compile Regular Expression: %s"), errbuf);
|
||||
- return ERROR;
|
||||
+ return false;
|
||||
}
|
||||
break;
|
||||
case INVERT_REGEX:
|
||||
- invert_regex = 1;
|
||||
+ invert_regex = true;
|
||||
break;
|
||||
case '4':
|
||||
address_family = AF_INET;
|
||||
@@ -1675,7 +1679,7 @@ process_arguments (int argc, char **argv)
|
||||
break;
|
||||
}
|
||||
case 'N': /* no-body */
|
||||
- no_body = TRUE;
|
||||
+ no_body = true;
|
||||
break;
|
||||
case 'M': /* max-age */
|
||||
{
|
||||
@@ -1698,10 +1702,10 @@ process_arguments (int argc, char **argv)
|
||||
}
|
||||
break;
|
||||
case 'E': /* show extended perfdata */
|
||||
- show_extended_perfdata = TRUE;
|
||||
+ show_extended_perfdata = true;
|
||||
break;
|
||||
case 'B': /* print body content after status line */
|
||||
- show_body = TRUE;
|
||||
+ show_body = true;
|
||||
break;
|
||||
case HTTP_VERSION_OPTION:
|
||||
curl_http_version = CURL_HTTP_VERSION_NONE;
|
||||
@@ -1721,7 +1725,7 @@ process_arguments (int argc, char **argv)
|
||||
}
|
||||
break;
|
||||
case AUTOMATIC_DECOMPRESSION:
|
||||
- automatic_decompression = TRUE;
|
||||
+ automatic_decompression = true;
|
||||
break;
|
||||
case COOKIE_JAR:
|
||||
cookie_jar_file = optarg;
|
||||
@@ -1765,52 +1769,52 @@ process_arguments (int argc, char **argv)
|
||||
virtual_port = server_port;
|
||||
else {
|
||||
if ((use_ssl && server_port == HTTPS_PORT) || (!use_ssl && server_port == HTTP_PORT))
|
||||
- if(specify_port == FALSE)
|
||||
+ if(!specify_port)
|
||||
server_port = virtual_port;
|
||||
}
|
||||
|
||||
- return TRUE;
|
||||
+ return true;
|
||||
}
|
||||
|
||||
char *perfd_time (double elapsed_time)
|
||||
{
|
||||
return fperfdata ("time", elapsed_time, "s",
|
||||
- thlds->warning?TRUE:FALSE, thlds->warning?thlds->warning->end:0,
|
||||
- thlds->critical?TRUE:FALSE, thlds->critical?thlds->critical->end:0,
|
||||
- TRUE, 0, TRUE, socket_timeout);
|
||||
+ thlds->warning?true:false, thlds->warning?thlds->warning->end:0,
|
||||
+ thlds->critical?true:false, thlds->critical?thlds->critical->end:0,
|
||||
+ true, 0, true, socket_timeout);
|
||||
}
|
||||
|
||||
char *perfd_time_connect (double elapsed_time_connect)
|
||||
{
|
||||
- return fperfdata ("time_connect", elapsed_time_connect, "s", FALSE, 0, FALSE, 0, FALSE, 0, TRUE, socket_timeout);
|
||||
+ return fperfdata ("time_connect", elapsed_time_connect, "s", false, 0, false, 0, false, 0, true, socket_timeout);
|
||||
}
|
||||
|
||||
char *perfd_time_ssl (double elapsed_time_ssl)
|
||||
{
|
||||
- return fperfdata ("time_ssl", elapsed_time_ssl, "s", FALSE, 0, FALSE, 0, FALSE, 0, TRUE, socket_timeout);
|
||||
+ return fperfdata ("time_ssl", elapsed_time_ssl, "s", false, 0, false, 0, false, 0, true, socket_timeout);
|
||||
}
|
||||
|
||||
char *perfd_time_headers (double elapsed_time_headers)
|
||||
{
|
||||
- return fperfdata ("time_headers", elapsed_time_headers, "s", FALSE, 0, FALSE, 0, FALSE, 0, TRUE, socket_timeout);
|
||||
+ return fperfdata ("time_headers", elapsed_time_headers, "s", false, 0, false, 0, false, 0, true, socket_timeout);
|
||||
}
|
||||
|
||||
char *perfd_time_firstbyte (double elapsed_time_firstbyte)
|
||||
{
|
||||
- return fperfdata ("time_firstbyte", elapsed_time_firstbyte, "s", FALSE, 0, FALSE, 0, FALSE, 0, TRUE, socket_timeout);
|
||||
+ return fperfdata ("time_firstbyte", elapsed_time_firstbyte, "s", false, 0, false, 0, false, 0, true, socket_timeout);
|
||||
}
|
||||
|
||||
char *perfd_time_transfer (double elapsed_time_transfer)
|
||||
{
|
||||
- return fperfdata ("time_transfer", elapsed_time_transfer, "s", FALSE, 0, FALSE, 0, FALSE, 0, TRUE, socket_timeout);
|
||||
+ return fperfdata ("time_transfer", elapsed_time_transfer, "s", false, 0, false, 0, false, 0, true, socket_timeout);
|
||||
}
|
||||
|
||||
char *perfd_size (int page_len)
|
||||
{
|
||||
return perfdata ("size", page_len, "B",
|
||||
- (min_page_len>0?TRUE:FALSE), min_page_len,
|
||||
- (min_page_len>0?TRUE:FALSE), 0,
|
||||
- TRUE, 0, FALSE, 0);
|
||||
+ (min_page_len>0?true:false), min_page_len,
|
||||
+ (min_page_len>0?true:false), 0,
|
||||
+ true, 0, false, 0);
|
||||
}
|
||||
|
||||
void
|
200
debian/patches/13_check_icmp_improvements
vendored
Normal file
200
debian/patches/13_check_icmp_improvements
vendored
Normal file
|
@ -0,0 +1,200 @@
|
|||
From 413af1955538b06803458c628099f1ba9da1966b Mon Sep 17 00:00:00 2001
|
||||
From: RincewindsHat <12514511+RincewindsHat@users.noreply.github.com>
|
||||
Date: Fri, 4 Nov 2022 16:51:32 +0100
|
||||
Subject: [PATCH 1/5] Remove trailing whitespaces
|
||||
|
||||
---
|
||||
plugins-root/check_icmp.c | 24 ++++++++++++------------
|
||||
1 file changed, 12 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/plugins-root/check_icmp.c b/plugins-root/check_icmp.c
|
||||
index f8f153512..abd88c4e7 100644
|
||||
--- a/plugins-root/check_icmp.c
|
||||
+++ b/plugins-root/check_icmp.c
|
||||
@@ -1,39 +1,39 @@
|
||||
/*****************************************************************************
|
||||
-*
|
||||
+*
|
||||
* Monitoring check_icmp plugin
|
||||
-*
|
||||
+*
|
||||
* License: GPL
|
||||
* Copyright (c) 2005-2008 Monitoring Plugins Development Team
|
||||
* Original Author : Andreas Ericsson <ae@op5.se>
|
||||
-*
|
||||
+*
|
||||
* Description:
|
||||
-*
|
||||
+*
|
||||
* This file contains the check_icmp plugin
|
||||
-*
|
||||
+*
|
||||
* Relevant RFC's: 792 (ICMP), 791 (IP)
|
||||
-*
|
||||
+*
|
||||
* This program was modeled somewhat after the check_icmp program,
|
||||
* which was in turn a hack of fping (www.fping.org) but has been
|
||||
* completely rewritten since to generate higher precision rta values,
|
||||
* and support several different modes as well as setting ttl to control.
|
||||
* redundant routes. The only remainders of fping is currently a few
|
||||
* function names.
|
||||
-*
|
||||
-*
|
||||
+*
|
||||
+*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
-*
|
||||
-*
|
||||
+*
|
||||
+*
|
||||
*****************************************************************************/
|
||||
|
||||
/* progname may change */
|
||||
|
||||
From 7d074091dba8c1d4081971bf62e694d0b1a03d41 Mon Sep 17 00:00:00 2001
|
||||
From: RincewindsHat <12514511+RincewindsHat@users.noreply.github.com>
|
||||
Date: Fri, 4 Nov 2022 16:53:57 +0100
|
||||
Subject: [PATCH 2/5] Remove hardcoded DBL_MAX definition
|
||||
|
||||
---
|
||||
plugins-root/check_icmp.c | 4 ----
|
||||
1 file changed, 4 deletions(-)
|
||||
|
||||
diff --git a/plugins-root/check_icmp.c b/plugins-root/check_icmp.c
|
||||
index abd88c4e7..0d10d22db 100644
|
||||
--- a/plugins-root/check_icmp.c
|
||||
+++ b/plugins-root/check_icmp.c
|
||||
@@ -95,10 +95,6 @@ const char *email = "devel@monitoring-plugins.org";
|
||||
# define ICMP_UNREACH_PRECEDENCE_CUTOFF 15
|
||||
#endif
|
||||
|
||||
-#ifndef DBL_MAX
|
||||
-# define DBL_MAX 9.9999999999e999
|
||||
-#endif
|
||||
-
|
||||
typedef unsigned short range_t; /* type for get_range() -- unimplemented */
|
||||
|
||||
typedef struct rta_host {
|
||||
|
||||
From 9a73a94258689cd9337fe7a7937fe85e4670aaeb Mon Sep 17 00:00:00 2001
|
||||
From: RincewindsHat <12514511+RincewindsHat@users.noreply.github.com>
|
||||
Date: Fri, 4 Nov 2022 17:08:36 +0100
|
||||
Subject: [PATCH 3/5] Replace DBL_MAX with INFITY to check if value was set
|
||||
|
||||
---
|
||||
plugins-root/check_icmp.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/plugins-root/check_icmp.c b/plugins-root/check_icmp.c
|
||||
index 0d10d22db..7f3c4b5ba 100644
|
||||
--- a/plugins-root/check_icmp.c
|
||||
+++ b/plugins-root/check_icmp.c
|
||||
@@ -55,6 +55,7 @@ const char *email = "devel@monitoring-plugins.org";
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#include <ctype.h>
|
||||
+#include <float.h>
|
||||
#include <net/if.h>
|
||||
#include <netinet/in_systm.h>
|
||||
#include <netinet/in.h>
|
||||
@@ -1220,7 +1221,7 @@ finish(int sig)
|
||||
host->rta / 1000, (float)warn.rta / 1000, (float)crit.rta / 1000,
|
||||
(targets > 1) ? host->name : "", host->pl, warn.pl, crit.pl,
|
||||
(targets > 1) ? host->name : "", (float)host->rtmax / 1000,
|
||||
- (targets > 1) ? host->name : "", (host->rtmin < DBL_MAX) ? (float)host->rtmin / 1000 : (float)0);
|
||||
+ (targets > 1) ? host->name : "", (host->rtmin < INFINITY) ? (float)host->rtmin / 1000 : (float)0);
|
||||
|
||||
host = host->next;
|
||||
}
|
||||
@@ -1323,7 +1324,7 @@ add_target_ip(char *arg, struct sockaddr_storage *in)
|
||||
memcpy(host_sin6->sin6_addr.s6_addr, sin6->sin6_addr.s6_addr, sizeof host_sin6->sin6_addr.s6_addr);
|
||||
}
|
||||
|
||||
- host->rtmin = DBL_MAX;
|
||||
+ host->rtmin = INFINITY;
|
||||
|
||||
if(!list) list = cursor = host;
|
||||
else cursor->next = host;
|
||||
|
||||
From d3a4bad51d72a3c5bcc06ceb5e0a823dcc24bf49 Mon Sep 17 00:00:00 2001
|
||||
From: RincewindsHat <12514511+RincewindsHat@users.noreply.github.com>
|
||||
Date: Sun, 19 Feb 2023 14:31:21 +0100
|
||||
Subject: [PATCH 4/5] check_icmp: Fix compiler warning
|
||||
|
||||
This fixes a compiler warning with no real world impact.
|
||||
The compiler complains about a missing return, which is correct, but
|
||||
in that scenario the program would crash anyways, so this has no impact.
|
||||
---
|
||||
plugins-root/check_icmp.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/plugins-root/check_icmp.c b/plugins-root/check_icmp.c
|
||||
index 7f3c4b5ba..317cd5357 100644
|
||||
--- a/plugins-root/check_icmp.c
|
||||
+++ b/plugins-root/check_icmp.c
|
||||
@@ -1430,20 +1430,21 @@ set_source_ip(char *arg)
|
||||
static in_addr_t
|
||||
get_ip_address(const char *ifname)
|
||||
{
|
||||
+ // TODO: Rewrite this so the function return an error and we exit somewhere else
|
||||
+ struct sockaddr_in ip;
|
||||
#if defined(SIOCGIFADDR)
|
||||
struct ifreq ifr;
|
||||
- struct sockaddr_in ip;
|
||||
|
||||
strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name) - 1);
|
||||
ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = '\0';
|
||||
if(ioctl(icmp_sock, SIOCGIFADDR, &ifr) == -1)
|
||||
crash("Cannot determine IP address of interface %s", ifname);
|
||||
memcpy(&ip, &ifr.ifr_addr, sizeof(ip));
|
||||
- return ip.sin_addr.s_addr;
|
||||
#else
|
||||
errno = 0;
|
||||
crash("Cannot get interface IP address on this platform.");
|
||||
#endif
|
||||
+ return ip.sin_addr.s_addr;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
From 423284edfa980fc3fdb51ab20af96685a988ba97 Mon Sep 17 00:00:00 2001
|
||||
From: RincewindsHat <12514511+RincewindsHat@users.noreply.github.com>
|
||||
Date: Sun, 19 Feb 2023 14:34:29 +0100
|
||||
Subject: [PATCH 5/5] check_icmp: Fix compiler warning
|
||||
|
||||
This fixes a compiler warning which complains about an uninitialized
|
||||
value for a variable which is then returned.
|
||||
This had no real world impact, since the program would crash in the
|
||||
branch where result is not set.
|
||||
The variable is initialized to "-1" which would be the error for
|
||||
inet_pton.
|
||||
---
|
||||
plugins-root/check_icmp.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/plugins-root/check_icmp.c b/plugins-root/check_icmp.c
|
||||
index 317cd5357..e59e92d33 100644
|
||||
--- a/plugins-root/check_icmp.c
|
||||
+++ b/plugins-root/check_icmp.c
|
||||
@@ -1339,7 +1339,7 @@ add_target_ip(char *arg, struct sockaddr_storage *in)
|
||||
static int
|
||||
add_target(char *arg)
|
||||
{
|
||||
- int error, result;
|
||||
+ int error, result = -1;
|
||||
struct sockaddr_storage ip;
|
||||
struct addrinfo hints, *res, *p;
|
||||
struct sockaddr_in *sin;
|
211
debian/patches/14_check_curl_fix_SSL_with_multiple_IPs
vendored
Normal file
211
debian/patches/14_check_curl_fix_SSL_with_multiple_IPs
vendored
Normal file
|
@ -0,0 +1,211 @@
|
|||
From 03f86b5d0809967855fbaafb4d600dc5b82081fa Mon Sep 17 00:00:00 2001
|
||||
From: Andreas Baumann <mail@andreasbaumann.cc>
|
||||
Date: Tue, 7 Mar 2023 19:51:33 +0100
|
||||
Subject: [PATCH 1/4] check_curl: in SSL host caching mode try to connect and
|
||||
bind and take the first getaddrinfo result which succeeds
|
||||
|
||||
---
|
||||
plugins/check_curl.c | 22 +++++++++++++++-------
|
||||
1 file changed, 15 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/plugins/check_curl.c b/plugins/check_curl.c
|
||||
index c37d45d91..e1bc98dc9 100644
|
||||
--- a/plugins/check_curl.c
|
||||
+++ b/plugins/check_curl.c
|
||||
@@ -386,6 +386,7 @@ lookup_host (const char *host, char *buf, size_t buflen)
|
||||
struct addrinfo hints, *res, *result;
|
||||
int errcode;
|
||||
void *ptr;
|
||||
+ int s;
|
||||
|
||||
memset (&hints, 0, sizeof (hints));
|
||||
hints.ai_family = address_family;
|
||||
@@ -399,19 +400,26 @@ lookup_host (const char *host, char *buf, size_t buflen)
|
||||
res = result;
|
||||
|
||||
while (res) {
|
||||
- inet_ntop (res->ai_family, res->ai_addr->sa_data, buf, buflen);
|
||||
- switch (res->ai_family) {
|
||||
- case AF_INET:
|
||||
- ptr = &((struct sockaddr_in *) res->ai_addr)->sin_addr;
|
||||
+ inet_ntop (res->ai_family, res->ai_addr->sa_data, buf, buflen);
|
||||
+ switch (res->ai_family) {
|
||||
+ case AF_INET:
|
||||
+ ptr = &((struct sockaddr_in *) res->ai_addr)->sin_addr;
|
||||
+ break;
|
||||
+ case AF_INET6:
|
||||
+ ptr = &((struct sockaddr_in6 *) res->ai_addr)->sin6_addr;
|
||||
break;
|
||||
- case AF_INET6:
|
||||
- ptr = &((struct sockaddr_in6 *) res->ai_addr)->sin6_addr;
|
||||
- break;
|
||||
}
|
||||
+
|
||||
inet_ntop (res->ai_family, ptr, buf, buflen);
|
||||
if (verbose >= 1)
|
||||
printf ("* getaddrinfo IPv%d address: %s\n",
|
||||
res->ai_family == PF_INET6 ? 6 : 4, buf);
|
||||
+
|
||||
+ if (s = socket (res->ai_family, res->ai_socktype, res->ai_protocol) == -1)
|
||||
+ continue;
|
||||
+ if (bind (s, res->ai_addr, res->ai_addrlen == 0) )
|
||||
+ break;
|
||||
+
|
||||
res = res->ai_next;
|
||||
}
|
||||
|
||||
|
||||
From 2902381c5de01f69d61569b0c8dae6a92e2b9843 Mon Sep 17 00:00:00 2001
|
||||
From: Barak Shohat <barak@bazzisoft.com>
|
||||
Date: Wed, 8 Mar 2023 11:56:43 +0200
|
||||
Subject: [PATCH 2/4] check_curl.c: Include all IPs from getaddrinfo() in curl
|
||||
DNS cache
|
||||
|
||||
---
|
||||
plugins/check_curl.c | 39 ++++++++++++++++++++++++++-------------
|
||||
1 file changed, 26 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/plugins/check_curl.c b/plugins/check_curl.c
|
||||
index e1bc98dc9..512fb88a6 100644
|
||||
--- a/plugins/check_curl.c
|
||||
+++ b/plugins/check_curl.c
|
||||
@@ -384,9 +384,12 @@ int
|
||||
lookup_host (const char *host, char *buf, size_t buflen)
|
||||
{
|
||||
struct addrinfo hints, *res, *result;
|
||||
+ char addrstr[100];
|
||||
+ size_t addrstr_len;
|
||||
int errcode;
|
||||
void *ptr;
|
||||
int s;
|
||||
+ size_t buflen_remaining = buflen - 1;
|
||||
|
||||
memset (&hints, 0, sizeof (hints));
|
||||
hints.ai_family = address_family;
|
||||
@@ -396,33 +399,40 @@ lookup_host (const char *host, char *buf, size_t buflen)
|
||||
errcode = getaddrinfo (host, NULL, &hints, &result);
|
||||
if (errcode != 0)
|
||||
return errcode;
|
||||
-
|
||||
+
|
||||
+ strcpy(buf, "");
|
||||
res = result;
|
||||
|
||||
while (res) {
|
||||
- inet_ntop (res->ai_family, res->ai_addr->sa_data, buf, buflen);
|
||||
switch (res->ai_family) {
|
||||
case AF_INET:
|
||||
ptr = &((struct sockaddr_in *) res->ai_addr)->sin_addr;
|
||||
break;
|
||||
case AF_INET6:
|
||||
ptr = &((struct sockaddr_in6 *) res->ai_addr)->sin6_addr;
|
||||
- break;
|
||||
+ break;
|
||||
}
|
||||
|
||||
- inet_ntop (res->ai_family, ptr, buf, buflen);
|
||||
- if (verbose >= 1)
|
||||
+ inet_ntop (res->ai_family, ptr, addrstr, 100);
|
||||
+ if (verbose >= 1) {
|
||||
printf ("* getaddrinfo IPv%d address: %s\n",
|
||||
- res->ai_family == PF_INET6 ? 6 : 4, buf);
|
||||
+ res->ai_family == PF_INET6 ? 6 : 4, addrstr);
|
||||
+ }
|
||||
|
||||
- if (s = socket (res->ai_family, res->ai_socktype, res->ai_protocol) == -1)
|
||||
- continue;
|
||||
- if (bind (s, res->ai_addr, res->ai_addrlen == 0) )
|
||||
- break;
|
||||
+ // Append all IPs to buf as a comma-separated string
|
||||
+ addrstr_len = strlen(addrstr);
|
||||
+ if (buflen_remaining > addrstr_len + 1) {
|
||||
+ if (buf[0] != NULL) {
|
||||
+ strncat(buf, ",", 1);
|
||||
+ buflen_remaining -= 1;
|
||||
+ }
|
||||
+ strncat(buf, addrstr, buflen_remaining);
|
||||
+ buflen_remaining -= addrstr_len;
|
||||
+ }
|
||||
|
||||
res = res->ai_next;
|
||||
}
|
||||
-
|
||||
+
|
||||
freeaddrinfo(result);
|
||||
|
||||
return 0;
|
||||
@@ -453,7 +463,7 @@ check_http (void)
|
||||
int i;
|
||||
char *force_host_header = NULL;
|
||||
struct curl_slist *host = NULL;
|
||||
- char addrstr[100];
|
||||
+ char addrstr[DEFAULT_BUFFER_SIZE/2];
|
||||
char dnscache[DEFAULT_BUFFER_SIZE];
|
||||
|
||||
/* initialize curl */
|
||||
@@ -505,7 +515,7 @@ check_http (void)
|
||||
|
||||
// fill dns resolve cache to make curl connect to the given server_address instead of the host_name, only required for ssl, because we use the host_name later on to make SNI happy
|
||||
if(use_ssl && host_name != NULL) {
|
||||
- if ( (res=lookup_host (server_address, addrstr, 100)) != 0) {
|
||||
+ if ( (res=lookup_host (server_address, addrstr, DEFAULT_BUFFER_SIZE/2)) != 0) {
|
||||
snprintf (msg, DEFAULT_BUFFER_SIZE, _("Unable to lookup IP address for '%s': getaddrinfo returned %d - %s"),
|
||||
server_address, res, gai_strerror (res));
|
||||
die (STATE_CRITICAL, "HTTP CRITICAL - %s\n", msg);
|
||||
@@ -800,6 +810,9 @@ check_http (void)
|
||||
/* free header and server IP resolve lists, we don't need it anymore */
|
||||
curl_slist_free_all (header_list); header_list = NULL;
|
||||
curl_slist_free_all (server_ips); server_ips = NULL;
|
||||
+ if (host) {
|
||||
+ curl_slist_free_all (host); host = NULL;
|
||||
+ }
|
||||
|
||||
/* Curl errors, result in critical Nagios state */
|
||||
if (res != CURLE_OK) {
|
||||
|
||||
From fc927e98db73850e760f490117ed36f2de20270c Mon Sep 17 00:00:00 2001
|
||||
From: Andreas Baumann <mail@andreasbaumann.cc>
|
||||
Date: Wed, 8 Mar 2023 16:10:45 +0100
|
||||
Subject: [PATCH 3/4] fixed a wrong compare and a wrong size in strncat
|
||||
|
||||
---
|
||||
plugins/check_curl.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/plugins/check_curl.c b/plugins/check_curl.c
|
||||
index 512fb88a6..cc17ef58a 100644
|
||||
--- a/plugins/check_curl.c
|
||||
+++ b/plugins/check_curl.c
|
||||
@@ -422,8 +422,8 @@ lookup_host (const char *host, char *buf, size_t buflen)
|
||||
// Append all IPs to buf as a comma-separated string
|
||||
addrstr_len = strlen(addrstr);
|
||||
if (buflen_remaining > addrstr_len + 1) {
|
||||
- if (buf[0] != NULL) {
|
||||
- strncat(buf, ",", 1);
|
||||
+ if (buf[0] != '\0') {
|
||||
+ strncat(buf, ",", buflen_remaining);
|
||||
buflen_remaining -= 1;
|
||||
}
|
||||
strncat(buf, addrstr, buflen_remaining);
|
||||
|
||||
From ea53555f2d6254da5fec0c1061899a01dd5321ec Mon Sep 17 00:00:00 2001
|
||||
From: Andreas Baumann <mail@andreasbaumann.cc>
|
||||
Date: Sat, 11 Mar 2023 11:40:00 +0100
|
||||
Subject: [PATCH 4/4] check_curl: removed a superflous variable
|
||||
|
||||
---
|
||||
plugins/check_curl.c | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/plugins/check_curl.c b/plugins/check_curl.c
|
||||
index cc17ef58a..e5be1ad56 100644
|
||||
--- a/plugins/check_curl.c
|
||||
+++ b/plugins/check_curl.c
|
||||
@@ -388,7 +388,6 @@ lookup_host (const char *host, char *buf, size_t buflen)
|
||||
size_t addrstr_len;
|
||||
int errcode;
|
||||
void *ptr;
|
||||
- int s;
|
||||
size_t buflen_remaining = buflen - 1;
|
||||
|
||||
memset (&hints, 0, sizeof (hints));
|
23
debian/patches/15_check_swap_remove_includes
vendored
Normal file
23
debian/patches/15_check_swap_remove_includes
vendored
Normal file
|
@ -0,0 +1,23 @@
|
|||
From 8a8ee58e8925019b7532e7d14ebe488bb21fb3e6 Mon Sep 17 00:00:00 2001
|
||||
From: RincewindsHat <12514511+RincewindsHat@users.noreply.github.com>
|
||||
Date: Thu, 16 Mar 2023 15:26:52 +0100
|
||||
Subject: [PATCH] check_swap: Remove unnecessary and problematic includes
|
||||
|
||||
---
|
||||
plugins/check_swap.c | 3 ---
|
||||
1 file changed, 3 deletions(-)
|
||||
|
||||
diff --git a/plugins/check_swap.c b/plugins/check_swap.c
|
||||
index a607da1e9..25d5f21d0 100644
|
||||
--- a/plugins/check_swap.c
|
||||
+++ b/plugins/check_swap.c
|
||||
@@ -34,9 +34,6 @@ const char *email = "devel@monitoring-plugins.org";
|
||||
#include "common.h"
|
||||
#include "popen.h"
|
||||
#include "utils.h"
|
||||
-#include <string.h>
|
||||
-#include <math.h>
|
||||
-#include <libintl.h>
|
||||
|
||||
#ifdef HAVE_DECL_SWAPCTL
|
||||
# ifdef HAVE_SYS_PARAM_H
|
90
debian/patches/16_check_snmp_disable_multiplier_when_unused
vendored
Normal file
90
debian/patches/16_check_snmp_disable_multiplier_when_unused
vendored
Normal file
|
@ -0,0 +1,90 @@
|
|||
From c874f950e8e5b6a805d8adf759d521501b22c7ce Mon Sep 17 00:00:00 2001
|
||||
From: Sven Nierlein <Sven.Nierlein@consol.de>
|
||||
Date: Wed, 15 Mar 2023 09:51:18 +0100
|
||||
Subject: [PATCH 1/2] check_snmp: disable multiplier when unused
|
||||
|
||||
- if no multiplier is set, simply return the given string. Otherwise we would strip off the unit.
|
||||
- if used, allocate new space to hold the result which might be larger than the initial input
|
||||
|
||||
Signed-off-by: Sven Nierlein <sven@consol.de>
|
||||
---
|
||||
plugins/check_snmp.c | 13 +++++++++----
|
||||
1 file changed, 9 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c
|
||||
index d3968a27d..c4ddd0edd 100644
|
||||
--- a/plugins/check_snmp.c
|
||||
+++ b/plugins/check_snmp.c
|
||||
@@ -46,6 +46,7 @@ const char *email = "devel@monitoring-plugins.org";
|
||||
#define DEFAULT_PRIV_PROTOCOL "DES"
|
||||
#define DEFAULT_DELIMITER "="
|
||||
#define DEFAULT_OUTPUT_DELIMITER " "
|
||||
+#define DEFAULT_BUFFER_SIZE 100
|
||||
|
||||
#define mark(a) ((a)!=0?"*":"")
|
||||
|
||||
@@ -157,6 +158,7 @@ int perf_labels = 1;
|
||||
char* ip_version = "";
|
||||
double multiplier = 1.0;
|
||||
char *fmtstr = "";
|
||||
+char buffer[DEFAULT_BUFFER_SIZE];
|
||||
|
||||
static char *fix_snmp_range(char *th)
|
||||
{
|
||||
@@ -1169,6 +1171,9 @@ multiply (char *str)
|
||||
double val;
|
||||
char *conv = "%f";
|
||||
|
||||
+ if(multiplier == 1)
|
||||
+ return(str);
|
||||
+
|
||||
if(verbose>2)
|
||||
printf(" multiply input: %s\n", str);
|
||||
|
||||
@@ -1187,15 +1192,15 @@ multiply (char *str)
|
||||
conv = fmtstr;
|
||||
}
|
||||
if (val == (int)val) {
|
||||
- sprintf(str, "%.0f", val);
|
||||
+ snprintf(buffer, DEFAULT_BUFFER_SIZE, "%.0f", val);
|
||||
} else {
|
||||
if(verbose>2)
|
||||
printf(" multiply using format: %s\n", conv);
|
||||
- sprintf(str, conv, val);
|
||||
+ snprintf(buffer, DEFAULT_BUFFER_SIZE, conv, val);
|
||||
}
|
||||
if(verbose>2)
|
||||
- printf(" multiply result: %s\n", str);
|
||||
- return str;
|
||||
+ printf(" multiply result: %s\n", buffer);
|
||||
+ return buffer;
|
||||
}
|
||||
|
||||
|
||||
|
||||
From 6e64973a4486248ff6c3de7d72637e44b6474c3e Mon Sep 17 00:00:00 2001
|
||||
From: Sven Nierlein <sven@consol.de>
|
||||
Date: Mon, 27 Mar 2023 12:59:53 +0200
|
||||
Subject: [PATCH 2/2] simplify code
|
||||
|
||||
if statement is always true at this point, so remove it.
|
||||
---
|
||||
plugins/check_snmp.c | 5 +----
|
||||
1 file changed, 1 insertion(+), 4 deletions(-)
|
||||
|
||||
diff --git a/plugins/check_snmp.c b/plugins/check_snmp.c
|
||||
index c4ddd0edd..aefda3d29 100644
|
||||
--- a/plugins/check_snmp.c
|
||||
+++ b/plugins/check_snmp.c
|
||||
@@ -1179,10 +1179,7 @@ multiply (char *str)
|
||||
|
||||
val = strtod (str, &endptr);
|
||||
if ((val == 0.0) && (endptr == str)) {
|
||||
- if(multiplier != 1) {
|
||||
- die(STATE_UNKNOWN, _("multiplier set (%.1f), but input is not a number: %s"), multiplier, str);
|
||||
- }
|
||||
- return str;
|
||||
+ die(STATE_UNKNOWN, _("multiplier set (%.1f), but input is not a number: %s"), multiplier, str);
|
||||
}
|
||||
|
||||
if(verbose>2)
|
166
debian/patches/17_fix_exit_codes
vendored
Normal file
166
debian/patches/17_fix_exit_codes
vendored
Normal file
|
@ -0,0 +1,166 @@
|
|||
From 5af4db7b4169acee20bfa2d637ce3f3eb5bdef47 Mon Sep 17 00:00:00 2001
|
||||
From: MisterMountain <bjoern.berg@netways.de>
|
||||
Date: Tue, 11 Apr 2023 16:26:12 +0200
|
||||
Subject: [PATCH 1/3] fixed the outputs of the --versions options on 3 scripts
|
||||
|
||||
---
|
||||
plugins-scripts/check_log.sh | 2 +-
|
||||
plugins-scripts/check_oracle.sh | 2 +-
|
||||
plugins-scripts/check_sensors.sh | 2 +-
|
||||
3 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/plugins-scripts/check_log.sh b/plugins-scripts/check_log.sh
|
||||
index c623a8d6b..10c56f14b 100755
|
||||
--- a/plugins-scripts/check_log.sh
|
||||
+++ b/plugins-scripts/check_log.sh
|
||||
@@ -109,7 +109,7 @@ while test -n "$1"; do
|
||||
;;
|
||||
-V | --version)
|
||||
print_revision "$PROGNAME" "$REVISION"
|
||||
- exit "$STATE_OK"
|
||||
+ exit "$STATE_UNKNOWN"
|
||||
;;
|
||||
-F | --filename)
|
||||
logfile=$2
|
||||
diff --git a/plugins-scripts/check_oracle.sh b/plugins-scripts/check_oracle.sh
|
||||
index b14ec50ed..f340b97c4 100755
|
||||
--- a/plugins-scripts/check_oracle.sh
|
||||
+++ b/plugins-scripts/check_oracle.sh
|
||||
@@ -95,7 +95,7 @@ case "$cmd" in
|
||||
;;
|
||||
--version)
|
||||
print_revision "$PROGNAME" "$REVISION"
|
||||
- exit "$STATE_OK"
|
||||
+ exit "$STATE_UNKNOWN"
|
||||
;;
|
||||
-V)
|
||||
print_revision "$PROGNAME" "$REVISION"
|
||||
diff --git a/plugins-scripts/check_sensors.sh b/plugins-scripts/check_sensors.sh
|
||||
index 921e7b365..3c4cf01bf 100755
|
||||
--- a/plugins-scripts/check_sensors.sh
|
||||
+++ b/plugins-scripts/check_sensors.sh
|
||||
@@ -34,7 +34,7 @@ case "$1" in
|
||||
;;
|
||||
--version)
|
||||
print_revision "$PROGNAME" "$REVISION"
|
||||
- exit "$STATE_OK"
|
||||
+ exit "$STATE_UNKNOWN"
|
||||
;;
|
||||
-V)
|
||||
print_revision "$PROGNAME" "$REVISION"
|
||||
|
||||
From 3dc677e4f1f990e7b26bc714a02608070379cf85 Mon Sep 17 00:00:00 2001
|
||||
From: MisterMountain <bjoern.berg@netways.de>
|
||||
Date: Tue, 11 Apr 2023 17:11:06 +0200
|
||||
Subject: [PATCH 2/3] fixed the identation (and also patched -V on check_oracle
|
||||
to behave exactly like --version again)
|
||||
|
||||
---
|
||||
plugins-scripts/check_oracle.sh | 10 +++++-----
|
||||
plugins-scripts/check_sensors.sh | 2 +-
|
||||
2 files changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/plugins-scripts/check_oracle.sh b/plugins-scripts/check_oracle.sh
|
||||
index f340b97c4..d58cfbea3 100755
|
||||
--- a/plugins-scripts/check_oracle.sh
|
||||
+++ b/plugins-scripts/check_oracle.sh
|
||||
@@ -86,20 +86,20 @@ esac
|
||||
# Information options
|
||||
case "$cmd" in
|
||||
--help)
|
||||
- print_help
|
||||
+ print_help
|
||||
exit "$STATE_OK"
|
||||
;;
|
||||
-h)
|
||||
- print_help
|
||||
+ print_help
|
||||
exit "$STATE_OK"
|
||||
;;
|
||||
--version)
|
||||
- print_revision "$PROGNAME" "$REVISION"
|
||||
+ print_revision "$PROGNAME" "$REVISION"
|
||||
exit "$STATE_UNKNOWN"
|
||||
;;
|
||||
-V)
|
||||
- print_revision "$PROGNAME" "$REVISION"
|
||||
- exit "$STATE_OK"
|
||||
+ print_revision "$PROGNAME" "$REVISION"
|
||||
+ exit "$STATE_UNKNOWN"
|
||||
;;
|
||||
esac
|
||||
|
||||
diff --git a/plugins-scripts/check_sensors.sh b/plugins-scripts/check_sensors.sh
|
||||
index 3c4cf01bf..adbfc533f 100755
|
||||
--- a/plugins-scripts/check_sensors.sh
|
||||
+++ b/plugins-scripts/check_sensors.sh
|
||||
@@ -38,7 +38,7 @@ case "$1" in
|
||||
;;
|
||||
-V)
|
||||
print_revision "$PROGNAME" "$REVISION"
|
||||
- exit "$STATE_OK"
|
||||
+ exit "$STATE_UNKNOWN"
|
||||
;;
|
||||
*)
|
||||
sensordata=$(sensors 2>&1)
|
||||
|
||||
From 21885d85d54ce2afe7b9bf962348dc60e31442e0 Mon Sep 17 00:00:00 2001
|
||||
From: MisterMountain <bjoern.berg@netways.de>
|
||||
Date: Tue, 2 May 2023 09:40:35 +0200
|
||||
Subject: [PATCH 3/3] also fixed the --help returns
|
||||
|
||||
---
|
||||
plugins-scripts/check_log.sh | 2 +-
|
||||
plugins-scripts/check_oracle.sh | 4 ++--
|
||||
plugins-scripts/check_sensors.sh | 4 ++--
|
||||
3 files changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/plugins-scripts/check_log.sh b/plugins-scripts/check_log.sh
|
||||
index 10c56f14b..8ecdd3164 100755
|
||||
--- a/plugins-scripts/check_log.sh
|
||||
+++ b/plugins-scripts/check_log.sh
|
||||
@@ -105,7 +105,7 @@ while test -n "$1"; do
|
||||
case "$1" in
|
||||
-h | --help)
|
||||
print_help
|
||||
- exit "$STATE_OK"
|
||||
+ exit "$STATE_UNKNOWN"
|
||||
;;
|
||||
-V | --version)
|
||||
print_revision "$PROGNAME" "$REVISION"
|
||||
diff --git a/plugins-scripts/check_oracle.sh b/plugins-scripts/check_oracle.sh
|
||||
index d58cfbea3..599813865 100755
|
||||
--- a/plugins-scripts/check_oracle.sh
|
||||
+++ b/plugins-scripts/check_oracle.sh
|
||||
@@ -87,11 +87,11 @@ esac
|
||||
case "$cmd" in
|
||||
--help)
|
||||
print_help
|
||||
- exit "$STATE_OK"
|
||||
+ exit "$STATE_UNKNOWN"
|
||||
;;
|
||||
-h)
|
||||
print_help
|
||||
- exit "$STATE_OK"
|
||||
+ exit "$STATE_UNKNOWN"
|
||||
;;
|
||||
--version)
|
||||
print_revision "$PROGNAME" "$REVISION"
|
||||
diff --git a/plugins-scripts/check_sensors.sh b/plugins-scripts/check_sensors.sh
|
||||
index adbfc533f..866e0e0f0 100755
|
||||
--- a/plugins-scripts/check_sensors.sh
|
||||
+++ b/plugins-scripts/check_sensors.sh
|
||||
@@ -26,11 +26,11 @@ print_help() {
|
||||
case "$1" in
|
||||
--help)
|
||||
print_help
|
||||
- exit "$STATE_OK"
|
||||
+ exit "$STATE_UNKNOWN"
|
||||
;;
|
||||
-h)
|
||||
print_help
|
||||
- exit "$STATE_OK"
|
||||
+ exit "$STATE_UNKNOWN"
|
||||
;;
|
||||
--version)
|
||||
print_revision "$PROGNAME" "$REVISION"
|
22
debian/patches/18_check_mysql_fix_typo
vendored
Normal file
22
debian/patches/18_check_mysql_fix_typo
vendored
Normal file
|
@ -0,0 +1,22 @@
|
|||
From d10ee31d89c2c599ee4c502e82d632aef8554020 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Lorenz=20K=C3=A4stle?= <lorenz.kaestle@netways.de>
|
||||
Date: Fri, 28 Apr 2023 16:51:39 +0200
|
||||
Subject: [PATCH] Typo in check_mysql
|
||||
|
||||
---
|
||||
plugins/check_mysql.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/plugins/check_mysql.c b/plugins/check_mysql.c
|
||||
index 0cba50e6d..6cfa70edb 100644
|
||||
--- a/plugins/check_mysql.c
|
||||
+++ b/plugins/check_mysql.c
|
||||
@@ -551,7 +551,7 @@ print_help (void)
|
||||
printf (" %s\n", _("Exit with CRITICAL status if slave server is more then INTEGER seconds"));
|
||||
printf (" %s\n", _("behind master"));
|
||||
printf (" %s\n", "-l, --ssl");
|
||||
- printf (" %s\n", _("Use ssl encryptation"));
|
||||
+ printf (" %s\n", _("Use ssl encryption"));
|
||||
printf (" %s\n", "-C, --ca-cert=STRING");
|
||||
printf (" %s\n", _("Path to CA signing the cert"));
|
||||
printf (" %s\n", "-a, --cert=STRING");
|
64
debian/patches/19_check_nwstat_fix_typo
vendored
Normal file
64
debian/patches/19_check_nwstat_fix_typo
vendored
Normal file
|
@ -0,0 +1,64 @@
|
|||
From cc69e8f76bcde8f75b5828b920bb937682673f49 Mon Sep 17 00:00:00 2001
|
||||
From: donien <matthias.doehler@netways.de>
|
||||
Date: Thu, 13 Apr 2023 17:15:16 +0200
|
||||
Subject: [PATCH] Fix 'requres' typo
|
||||
|
||||
---
|
||||
plugins/check_nwstat.c | 2 +-
|
||||
po/de.po | 2 +-
|
||||
po/fr.po | 2 +-
|
||||
po/monitoring-plugins.pot | 2 +-
|
||||
4 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/plugins/check_nwstat.c b/plugins/check_nwstat.c
|
||||
index e7e8de05b..3c9d23e2e 100644
|
||||
--- a/plugins/check_nwstat.c
|
||||
+++ b/plugins/check_nwstat.c
|
||||
@@ -1668,7 +1668,7 @@ void print_help(void)
|
||||
|
||||
printf ("\n");
|
||||
printf ("%s\n", _("Notes:"));
|
||||
- printf (" %s\n", _("- This plugin requres that the MRTGEXT.NLM file from James Drews' MRTG"));
|
||||
+ printf (" %s\n", _("- This plugin requires that the MRTGEXT.NLM file from James Drews' MRTG"));
|
||||
printf (" %s\n", _(" extension for NetWare be loaded on the Novell servers you wish to check."));
|
||||
printf (" %s\n", _(" (available from http://www.engr.wisc.edu/~drews/mrtg/)"));
|
||||
printf (" %s\n", _("- Values for critical thresholds should be lower than warning thresholds"));
|
||||
diff --git a/po/de.po b/po/de.po
|
||||
index 919fae32b..c29cbbbac 100644
|
||||
--- a/po/de.po
|
||||
+++ b/po/de.po
|
||||
@@ -3315,7 +3315,7 @@ msgid "Include server version string in results"
|
||||
msgstr ""
|
||||
|
||||
#: plugins/check_nwstat.c:1671
|
||||
-msgid "- This plugin requres that the MRTGEXT.NLM file from James Drews' MRTG"
|
||||
+msgid "- This plugin requires that the MRTGEXT.NLM file from James Drews' MRTG"
|
||||
msgstr ""
|
||||
|
||||
#: plugins/check_nwstat.c:1672
|
||||
diff --git a/po/fr.po b/po/fr.po
|
||||
index e44cf88cb..b4de17ed6 100644
|
||||
--- a/po/fr.po
|
||||
+++ b/po/fr.po
|
||||
@@ -3372,7 +3372,7 @@ msgid "Include server version string in results"
|
||||
msgstr ""
|
||||
|
||||
#: plugins/check_nwstat.c:1671
|
||||
-msgid "- This plugin requres that the MRTGEXT.NLM file from James Drews' MRTG"
|
||||
+msgid "- This plugin requires that the MRTGEXT.NLM file from James Drews' MRTG"
|
||||
msgstr ""
|
||||
|
||||
#: plugins/check_nwstat.c:1672
|
||||
diff --git a/po/monitoring-plugins.pot b/po/monitoring-plugins.pot
|
||||
index 5bc236373..45f46a899 100644
|
||||
--- a/po/monitoring-plugins.pot
|
||||
+++ b/po/monitoring-plugins.pot
|
||||
@@ -3225,7 +3225,7 @@ msgid "Include server version string in results"
|
||||
msgstr ""
|
||||
|
||||
#: plugins/check_nwstat.c:1671
|
||||
-msgid "- This plugin requres that the MRTGEXT.NLM file from James Drews' MRTG"
|
||||
+msgid "- This plugin requires that the MRTGEXT.NLM file from James Drews' MRTG"
|
||||
msgstr ""
|
||||
|
||||
#: plugins/check_nwstat.c:1672
|
46
debian/patches/20_chech_nt_fix_encoding
vendored
Normal file
46
debian/patches/20_chech_nt_fix_encoding
vendored
Normal file
|
@ -0,0 +1,46 @@
|
|||
From b2659391aba7e4a79b678aba5cc21b443626f81f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Lorenz=20K=C3=A4stle?= <lorenz.kaestle@netways.de>
|
||||
Date: Wed, 26 Apr 2023 10:13:51 +0200
|
||||
Subject: [PATCH 1/2] check_nt: change encoding from latin1 to utf8
|
||||
|
||||
---
|
||||
plugins/check_nt.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/plugins/check_nt.c b/plugins/check_nt.c
|
||||
index 59c135dba..babe3b642 100644
|
||||
--- a/plugins/check_nt.c
|
||||
+++ b/plugins/check_nt.c
|
||||
@@ -341,7 +341,7 @@ int main(int argc, char **argv){
|
||||
|
||||
2) If the counter you're going to measure is percent-based, the code will detect
|
||||
the percent sign in its name and will attribute minimum (0%) and maximum (100%)
|
||||
- values automagically, as well the ¨%" sign to graph units.
|
||||
+ values automagically, as well the ¨%" sign to graph units.
|
||||
|
||||
3) OTOH, if the counter is "absolute", you'll have to provide the following
|
||||
the counter unit - that is, the dimensions of the counter you're getting. Examples:
|
||||
|
||||
From fcf68d702e590bd3e58fb7556f420330ddf0a0ae Mon Sep 17 00:00:00 2001
|
||||
From: Lorenz <12514511+RincewindsHat@users.noreply.github.com>
|
||||
Date: Thu, 27 Apr 2023 00:42:30 +0200
|
||||
Subject: [PATCH 2/2] Update plugins/check_nt.c
|
||||
|
||||
Co-authored-by: datamuc <m@rbfh.de>
|
||||
---
|
||||
plugins/check_nt.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/plugins/check_nt.c b/plugins/check_nt.c
|
||||
index babe3b642..d73d83cea 100644
|
||||
--- a/plugins/check_nt.c
|
||||
+++ b/plugins/check_nt.c
|
||||
@@ -341,7 +341,7 @@ int main(int argc, char **argv){
|
||||
|
||||
2) If the counter you're going to measure is percent-based, the code will detect
|
||||
the percent sign in its name and will attribute minimum (0%) and maximum (100%)
|
||||
- values automagically, as well the ¨%" sign to graph units.
|
||||
+ values automagically, as well the "%" sign to graph units.
|
||||
|
||||
3) OTOH, if the counter is "absolute", you'll have to provide the following
|
||||
the counter unit - that is, the dimensions of the counter you're getting. Examples:
|
46
debian/patches/21_check_pgsql_extra_output
vendored
Normal file
46
debian/patches/21_check_pgsql_extra_output
vendored
Normal file
|
@ -0,0 +1,46 @@
|
|||
From 9f15dac8e789a4b13d4f9e8897ee03fee84f494a Mon Sep 17 00:00:00 2001
|
||||
From: phowen <phowen@cisco.com>
|
||||
Date: Wed, 26 Apr 2017 13:40:27 +0100
|
||||
Subject: [PATCH] add extra output to pgsql check
|
||||
|
||||
---
|
||||
plugins/check_pgsql.c | 12 +++++++++++-
|
||||
1 file changed, 11 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/plugins/check_pgsql.c b/plugins/check_pgsql.c
|
||||
index c26cd439c..05fdc1568 100644
|
||||
--- a/plugins/check_pgsql.c
|
||||
+++ b/plugins/check_pgsql.c
|
||||
@@ -517,7 +517,10 @@ print_help (void)
|
||||
printf (" %s\n", _("connecting to the server. The result from the query has to be numeric."));
|
||||
printf (" %s\n", _("Multiple SQL commands, separated by semicolon, are allowed but the result "));
|
||||
printf (" %s\n", _("of the last command is taken into account only. The value of the first"));
|
||||
- printf (" %s\n\n", _("column in the first row is used as the check result."));
|
||||
+ printf (" %s\n", _("column in the first row is used as the check result. If a second column is"));
|
||||
+ printf (" %s\n", _("present in the result set, this is added to the plugin output with a"));
|
||||
+ printf (" %s\n", _("prefix of \"Extra Info:\". This information can be displayed in the system"));
|
||||
+ printf (" %s\n\n", _("executing the plugin."));
|
||||
|
||||
printf (" %s\n", _("See the chapter \"Monitoring Database Activity\" of the PostgreSQL manual"));
|
||||
printf (" %s\n\n", _("for details about how to access internal statistics of the database server."));
|
||||
@@ -557,6 +560,7 @@ do_query (PGconn *conn, char *query)
|
||||
PGresult *res;
|
||||
|
||||
char *val_str;
|
||||
+ char *extra_info;
|
||||
double value;
|
||||
|
||||
char *endptr = NULL;
|
||||
@@ -621,6 +625,12 @@ do_query (PGconn *conn, char *query)
|
||||
printf ("|query=%f;%s;%s;;\n", value,
|
||||
query_warning ? query_warning : "",
|
||||
query_critical ? query_critical : "");
|
||||
+ if (PQnfields (res) > 1) {
|
||||
+ extra_info = PQgetvalue (res, 0, 1);
|
||||
+ if (extra_info != NULL) {
|
||||
+ printf ("Extra Info: %s\n", extra_info);
|
||||
+ }
|
||||
+ }
|
||||
return my_status;
|
||||
}
|
||||
|
47
debian/patches/22_check_disk_avoid_mount
vendored
Normal file
47
debian/patches/22_check_disk_avoid_mount
vendored
Normal file
|
@ -0,0 +1,47 @@
|
|||
From 0dd11100aa92bab172293ec9615a8a56b0e35ee6 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Taferner <stefan.taferner@porscheinformatik.com>
|
||||
Date: Wed, 10 May 2023 19:28:05 +0200
|
||||
Subject: [PATCH] avoid mounting when searching for matching mount points
|
||||
|
||||
---
|
||||
lib/utils_disk.c | 17 +++++++++--------
|
||||
1 file changed, 9 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/lib/utils_disk.c b/lib/utils_disk.c
|
||||
index 468769b19..582d3ea17 100644
|
||||
--- a/lib/utils_disk.c
|
||||
+++ b/lib/utils_disk.c
|
||||
@@ -147,24 +147,25 @@ np_set_best_match(struct parameter_list *desired, struct mount_entry *mount_list
|
||||
|
||||
/* set best match if path name exactly matches a mounted device name */
|
||||
for (me = mount_list; me; me = me->me_next) {
|
||||
- if (get_fs_usage(me->me_mountdir, me->me_devname, &fsp) < 0)
|
||||
- continue; /* skip if permissions do not suffice for accessing device */
|
||||
- if (strcmp(me->me_devname, d->name)==0)
|
||||
- best_match = me;
|
||||
+ if (strcmp(me->me_devname, d->name)==0) {
|
||||
+ if (get_fs_usage(me->me_mountdir, me->me_devname, &fsp) >= 0) {
|
||||
+ best_match = me;
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
/* set best match by directory name if no match was found by devname */
|
||||
if (! best_match) {
|
||||
for (me = mount_list; me; me = me->me_next) {
|
||||
- if (get_fs_usage(me->me_mountdir, me->me_devname, &fsp) < 0)
|
||||
- continue; /* skip if permissions do not suffice for accessing device */
|
||||
size_t len = strlen (me->me_mountdir);
|
||||
if ((exact == FALSE && (best_match_len <= len && len <= name_len &&
|
||||
(len == 1 || strncmp (me->me_mountdir, d->name, len) == 0)))
|
||||
|| (exact == TRUE && strcmp(me->me_mountdir, d->name)==0))
|
||||
{
|
||||
- best_match = me;
|
||||
- best_match_len = len;
|
||||
+ if (get_fs_usage(me->me_mountdir, me->me_devname, &fsp) >= 0) {
|
||||
+ best_match = me;
|
||||
+ best_match_len = len;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
}
|
28
debian/patches/23_check_mysql_fix_error_handling
vendored
Normal file
28
debian/patches/23_check_mysql_fix_error_handling
vendored
Normal file
|
@ -0,0 +1,28 @@
|
|||
From 10863265324a9a9fdf8ce771271af15b7e2f5a4a Mon Sep 17 00:00:00 2001
|
||||
From: Platon Pronko <platon7pronko@gmail.com>
|
||||
Date: Fri, 19 May 2023 15:05:02 +0800
|
||||
Subject: [PATCH] check_mysql: handle ER_ACCESS_DENIED_NO_PASSWORD_ERROR if
|
||||
ignore_auth=1
|
||||
|
||||
In some situations MySQL might return ER_ACCESS_DENIED_NO_PASSWORD_ERROR
|
||||
instead of ER_ACCESS_DENIED_ERROR. Semantically these errors are the same.
|
||||
---
|
||||
plugins/check_mysql.c | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/plugins/check_mysql.c b/plugins/check_mysql.c
|
||||
index 6cfa70edb..91e150fbd 100644
|
||||
--- a/plugins/check_mysql.c
|
||||
+++ b/plugins/check_mysql.c
|
||||
@@ -138,7 +138,10 @@ main (int argc, char **argv)
|
||||
mysql_ssl_set(&mysql,key,cert,ca_cert,ca_dir,ciphers);
|
||||
/* establish a connection to the server and error checking */
|
||||
if (!mysql_real_connect(&mysql,db_host,db_user,db_pass,db,db_port,db_socket,0)) {
|
||||
- if (ignore_auth && mysql_errno (&mysql) == ER_ACCESS_DENIED_ERROR)
|
||||
+ /* Depending on internally-selected auth plugin MySQL might return */
|
||||
+ /* ER_ACCESS_DENIED_NO_PASSWORD_ERROR or ER_ACCESS_DENIED_ERROR. */
|
||||
+ /* Semantically these errors are the same. */
|
||||
+ if (ignore_auth && (mysql_errno (&mysql) == ER_ACCESS_DENIED_ERROR || mysql_errno (&mysql) == ER_ACCESS_DENIED_NO_PASSWORD_ERROR))
|
||||
{
|
||||
printf("MySQL OK - Version: %s (protocol %d)\n",
|
||||
mysql_get_server_info(&mysql),
|
26
debian/patches/30_check_radius_radcli_1.3.1_support
vendored
Normal file
26
debian/patches/30_check_radius_radcli_1.3.1_support
vendored
Normal file
|
@ -0,0 +1,26 @@
|
|||
From 6bbe0b7b0f609ecab831dec9be7690842bf0a0fc Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Henderson <sthen@users.noreply.github.com>
|
||||
Date: Wed, 8 Feb 2023 16:35:22 +0000
|
||||
Subject: [PATCH] cope with radcli-1.3.1 RC_BUFFER_LEN
|
||||
|
||||
radcli 1.3.1 now uses RC_BUFFER_LEN instead of BUFFER_LEN. Add an #ifdef to allow working with either.
|
||||
---
|
||||
plugins/check_radius.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/plugins/check_radius.c b/plugins/check_radius.c
|
||||
index be1001b4d..96a955536 100644
|
||||
--- a/plugins/check_radius.c
|
||||
+++ b/plugins/check_radius.c
|
||||
@@ -155,7 +155,11 @@ main (int argc, char **argv)
|
||||
{
|
||||
struct sockaddr_storage ss;
|
||||
char name[HOST_NAME_MAX];
|
||||
+#ifdef RC_BUFFER_LEN
|
||||
+ char msg[RC_BUFFER_LEN];
|
||||
+#else
|
||||
char msg[BUFFER_LEN];
|
||||
+#endif
|
||||
SEND_DATA data;
|
||||
int result = STATE_UNKNOWN;
|
||||
uint32_t client_id, service;
|
77
debian/patches/31_checl_mailq_separate_submission_queue
vendored
Normal file
77
debian/patches/31_checl_mailq_separate_submission_queue
vendored
Normal file
|
@ -0,0 +1,77 @@
|
|||
From 12ae1fb6627bfef419fb4571a7189909107f5e6e Mon Sep 17 00:00:00 2001
|
||||
From: Jan Wagner <waja@cyconet.org>
|
||||
Date: Tue, 1 Oct 2013 15:06:51 +0200
|
||||
Subject: [PATCH] check_mailq.pl: separate submission queue
|
||||
|
||||
check_mailq.pl ignores the separate submission queue used in (modern?) sendmail
|
||||
implementations.
|
||||
|
||||
For the queue output below with one message in the submission queue and no
|
||||
messages in the transport queue, check_mailq.pl reports zero messages in the
|
||||
queue because the request count from the last queue always overwrites previous
|
||||
queues. If the sendmail MTA isn't running or has become wedged, messages will
|
||||
sit in the submission queue forever.
|
||||
|
||||
The attached patch fixes this in a backwards compatible way (i.e., it shouldn't
|
||||
break any of the currently supported formats).
|
||||
--
|
||||
Just turning attached patch of github issue #972 into a push request.
|
||||
(Closes #972)
|
||||
---
|
||||
|
||||
diff --git a/plugins-scripts/check_mailq.pl b/plugins-scripts/check_mailq.pl
|
||||
index 27073d3cc..f02c90fbc 100755
|
||||
--- a/plugins-scripts/check_mailq.pl
|
||||
+++ b/plugins-scripts/check_mailq.pl
|
||||
@@ -149,7 +149,26 @@
|
||||
##/var/spool/mqueue/qF/df is empty
|
||||
## Total Requests: 1
|
||||
|
||||
-
|
||||
+# separate submission/transport queues, empty
|
||||
+## MSP Queue status...
|
||||
+## /var/spool/mqueue-client is empty
|
||||
+## Total requests: 0
|
||||
+## MTA Queue status...
|
||||
+## /var/spool/mqueue is empty
|
||||
+## Total requests: 0
|
||||
+# separate submission/transport queues: 1
|
||||
+## MSP Queue status...
|
||||
+## /var/spool/mqueue-client (1 request)
|
||||
+## -----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient-----------
|
||||
+## oAJEfhdW014123 5 Fri Nov 19 14:41 jwm
|
||||
+## (Deferred: Connection refused by [127.0.0.1])
|
||||
+## root
|
||||
+## Total requests: 1
|
||||
+## MTA Queue status...
|
||||
+## /var/spool/mqueue is empty
|
||||
+## Total requests: 0
|
||||
+
|
||||
+ my $this_msg_q = 0;
|
||||
while (<MAILQ>) {
|
||||
|
||||
# match email addr on queue listing
|
||||
@@ -189,13 +208,18 @@
|
||||
#
|
||||
# single queue: first line
|
||||
# multi queue: one for each queue. overwrite on multi queue below
|
||||
- $msg_q = $1 ;
|
||||
+ $this_msg_q = $1 ;
|
||||
+ $msg_q += $1 ;
|
||||
}
|
||||
} elsif (/^\s+Total\sRequests:\s(\d+)$/i) {
|
||||
- print "$utils::PATH_TO_MAILQ = $_ \n" if $verbose ;
|
||||
- #
|
||||
- # multi queue: last line
|
||||
- $msg_q = $1 ;
|
||||
+ if ($this_msg_q) {
|
||||
+ $this_msg_q = 0 ;
|
||||
+ } else {
|
||||
+ print "$utils::PATH_TO_MAILQ = $_ \n" if $verbose ;
|
||||
+ #
|
||||
+ # multi queue: last line
|
||||
+ $msg_q += $1 ;
|
||||
+ }
|
||||
}
|
||||
|
||||
}
|
839
debian/patches/32_check_disk_add_ignore_missing
vendored
Normal file
839
debian/patches/32_check_disk_add_ignore_missing
vendored
Normal file
|
@ -0,0 +1,839 @@
|
|||
From 8cf31437e99167ad9c260e6677b4d1ed31a34d56 Mon Sep 17 00:00:00 2001
|
||||
From: Kristian Schuster <116557017+KriSchu@users.noreply.github.com>
|
||||
Date: Mon, 24 Oct 2022 17:29:53 +0200
|
||||
Subject: [PATCH 1/9] check_disk: add ignore-missing option to return OK for
|
||||
missing fs There a situations where UNKNOWN or CRITICAL services are not
|
||||
wanted when a filesystem is missing, a regex does not match or the filesystem
|
||||
is inaccessible on a system. This new option helps to have the service in
|
||||
state OK.
|
||||
|
||||
---
|
||||
plugins/check_disk.c | 29 ++++++++++++++++++++++++-----
|
||||
1 file changed, 24 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/plugins/check_disk.c b/plugins/check_disk.c
|
||||
index 7018c6fd5..8df9e7ec8 100644
|
||||
--- a/plugins/check_disk.c
|
||||
+++ b/plugins/check_disk.c
|
||||
@@ -112,7 +112,8 @@ enum
|
||||
{
|
||||
SYNC_OPTION = CHAR_MAX + 1,
|
||||
NO_SYNC_OPTION,
|
||||
- BLOCK_SIZE_OPTION
|
||||
+ BLOCK_SIZE_OPTION,
|
||||
+ IGNORE_MISSING
|
||||
};
|
||||
|
||||
#ifdef _AIX
|
||||
@@ -140,6 +141,7 @@ int verbose = 0;
|
||||
int erronly = FALSE;
|
||||
int display_mntp = FALSE;
|
||||
int exact_match = FALSE;
|
||||
+int ignore_missing = FALSE;
|
||||
int freespace_ignore_reserved = FALSE;
|
||||
int display_inodes_perfdata = FALSE;
|
||||
char *warn_freespace_units = NULL;
|
||||
@@ -219,7 +221,9 @@ main (int argc, char **argv)
|
||||
temp_list = path_select_list;
|
||||
|
||||
while (temp_list) {
|
||||
- if (! temp_list->best_match) {
|
||||
+ if (! temp_list->best_match && ignore_missing == 1) {
|
||||
+ die (STATE_OK, _("DISK %s: %s not found (ignoring)\n"), _("OK"), temp_list->name);
|
||||
+ } else if (! temp_list->best_match) {
|
||||
die (STATE_CRITICAL, _("DISK %s: %s not found\n"), _("CRITICAL"), temp_list->name);
|
||||
}
|
||||
|
||||
@@ -481,6 +485,7 @@ process_arguments (int argc, char **argv)
|
||||
{"ignore-ereg-partition", required_argument, 0, 'i'},
|
||||
{"ignore-eregi-path", required_argument, 0, 'I'},
|
||||
{"ignore-eregi-partition", required_argument, 0, 'I'},
|
||||
+ {"ignore-missing", no_argument, 0, IGNORE_MISSING},
|
||||
{"local", no_argument, 0, 'l'},
|
||||
{"stat-remote-fs", no_argument, 0, 'L'},
|
||||
{"iperfdata", no_argument, 0, 'P'},
|
||||
@@ -718,6 +723,9 @@ process_arguments (int argc, char **argv)
|
||||
cflags = default_cflags;
|
||||
break;
|
||||
|
||||
+ case IGNORE_MISSING:
|
||||
+ ignore_missing = 1;
|
||||
+ break;
|
||||
case 'A':
|
||||
optarg = strdup(".*");
|
||||
// Intentional fallthrough
|
||||
@@ -753,7 +761,10 @@ process_arguments (int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
- if (!fnd)
|
||||
+ if (!fnd && ignore_missing == 1)
|
||||
+ die (STATE_OK, "DISK %s: %s - %s\n",_("OK"),
|
||||
+ _("Regular expression did not match any path or disk (ignoring)"), optarg);
|
||||
+ else if (!fnd)
|
||||
die (STATE_UNKNOWN, "DISK %s: %s - %s\n",_("UNKNOWN"),
|
||||
_("Regular expression did not match any path or disk"), optarg);
|
||||
|
||||
@@ -923,6 +934,9 @@ print_help (void)
|
||||
printf (" %s\n", _("Regular expression to ignore selected path/partition (case insensitive) (may be repeated)"));
|
||||
printf (" %s\n", "-i, --ignore-ereg-path=PATH, --ignore-ereg-partition=PARTITION");
|
||||
printf (" %s\n", _("Regular expression to ignore selected path or partition (may be repeated)"));
|
||||
+ printf (" %s\n", "--ignore-missing");
|
||||
+ printf (" %s\n", _("Return OK if no filesystem matches, filesystem does not exist or is inaccessible."));
|
||||
+ printf (" %s\n", _("(Provide this option before -r / --ereg-path if used)"));
|
||||
printf (UT_PLUG_TIMEOUT, DEFAULT_SOCKET_TIMEOUT);
|
||||
printf (" %s\n", "-u, --units=STRING");
|
||||
printf (" %s\n", _("Choose bytes, kB, MB, GB, TB (default: MB)"));
|
||||
@@ -965,8 +979,13 @@ stat_path (struct parameter_list *p)
|
||||
if (stat (p->name, &stat_buf[0])) {
|
||||
if (verbose >= 3)
|
||||
printf("stat failed on %s\n", p->name);
|
||||
- printf("DISK %s - ", _("CRITICAL"));
|
||||
- die (STATE_CRITICAL, _("%s %s: %s\n"), p->name, _("is not accessible"), strerror(errno));
|
||||
+ if (ignore_missing == 1) {
|
||||
+ printf("DISK %s - ", _("OK"));
|
||||
+ die (STATE_OK, _("%s %s: %s\n"), p->name, _("is not accessible (ignoring)"), strerror(errno));
|
||||
+ } else {
|
||||
+ printf("DISK %s - ", _("CRITICAL"));
|
||||
+ die (STATE_CRITICAL, _("%s %s: %s\n"), p->name, _("is not accessible"), strerror(errno));
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
From 0d562a356f45f645014c3908178fc13876006f6e Mon Sep 17 00:00:00 2001
|
||||
From: Kristian Schuster <116557017+KriSchu@users.noreply.github.com>
|
||||
Date: Tue, 25 Oct 2022 20:49:51 +0200
|
||||
Subject: [PATCH 2/9] check_disk: add tests for new option --ignore-missing
|
||||
|
||||
---
|
||||
plugins/t/check_disk.t | 15 +++++++++++++++
|
||||
1 file changed, 15 insertions(+)
|
||||
|
||||
diff --git a/plugins/t/check_disk.t b/plugins/t/check_disk.t
|
||||
index ec527e7f6..bea34a4c9 100644
|
||||
--- a/plugins/t/check_disk.t
|
||||
+++ b/plugins/t/check_disk.t
|
||||
@@ -351,3 +351,18 @@ unlike( $result->output, qr/$mountpoint2_valid/, "output data does not have $mou
|
||||
$result = NPTest->testCmd( "./check_disk -w 0% -c 0% -p $mountpoint_valid -p $mountpoint2_valid -i '^barbazJodsf\$'");
|
||||
like( $result->output, qr/$mountpoint_valid/, "ignore: output data does have $mountpoint_valid when regex doesn't match");
|
||||
like( $result->output, qr/$mountpoint2_valid/,"ignore: output data does have $mountpoint2_valid when regex doesn't match");
|
||||
+
|
||||
+# ignore-missing: exit okay, when fs is not accessible
|
||||
+$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -p /bob");
|
||||
+cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for not existing filesystem /bob");
|
||||
+like( $result->output, '/^DISK OK - /bob is not accessible .*$/', 'Output OK');
|
||||
+
|
||||
+# ignore-missing: exit okay, when regex does not match
|
||||
+$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -r /bob");
|
||||
+cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for regular expression not matching");
|
||||
+like( $result->output, '/^DISK OK: Regular expression did not match any path or disk.*$/', 'Output OK');
|
||||
+
|
||||
+# ignore-missing: exit okay, when fs with exact match (-E) is not found
|
||||
+$result = NPTest->testCmd( "./check_disk --ignore-missing -E -w 0% -c 0% -p /etc");
|
||||
+cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay when exact match does not find fs");
|
||||
+like( $result->output, '/^DISK OK: /etc not found.*$/', 'Output OK');
|
||||
|
||||
From bacacd2cb38c7d7a695a6f75f699168d9df0132d Mon Sep 17 00:00:00 2001
|
||||
From: Sven Nierlein <sven@nierlein.org>
|
||||
Date: Wed, 26 Oct 2022 14:03:22 +0200
|
||||
Subject: [PATCH 3/9] check_disk: adjust test plan
|
||||
|
||||
---
|
||||
plugins/t/check_disk.t | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/plugins/t/check_disk.t b/plugins/t/check_disk.t
|
||||
index bea34a4c9..a534fd4a5 100644
|
||||
--- a/plugins/t/check_disk.t
|
||||
+++ b/plugins/t/check_disk.t
|
||||
@@ -23,7 +23,7 @@ my $mountpoint2_valid = getTestParameter( "NP_MOUNTPOINT2_VALID", "Path to anoth
|
||||
if ($mountpoint_valid eq "" or $mountpoint2_valid eq "") {
|
||||
plan skip_all => "Need 2 mountpoints to test";
|
||||
} else {
|
||||
- plan tests => 78;
|
||||
+ plan tests => 84;
|
||||
}
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
|
||||
From 9898a8ad7dabfabfe80785585a5bbc30b678bdb0 Mon Sep 17 00:00:00 2001
|
||||
From: Kristian Schuster <116557017+KriSchu@users.noreply.github.com>
|
||||
Date: Sun, 19 Feb 2023 13:44:04 +0100
|
||||
Subject: [PATCH 4/9] utils_disk: add name_prev pointer to struct
|
||||
parameter_list
|
||||
|
||||
Also added handling of name_prev in np_add_parameter and np_delete_parameter.
|
||||
This make calling the np_delete_parameter function easier, because it requires
|
||||
the previous element as second argument.
|
||||
---
|
||||
lib/utils_disk.c | 19 +++++++++++++++++--
|
||||
lib/utils_disk.h | 1 +
|
||||
2 files changed, 18 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/lib/utils_disk.c b/lib/utils_disk.c
|
||||
index c7c9126e4..a1181d37b 100644
|
||||
--- a/lib/utils_disk.c
|
||||
+++ b/lib/utils_disk.c
|
||||
@@ -46,9 +46,10 @@ np_add_parameter(struct parameter_list **list, const char *name)
|
||||
struct parameter_list *current = *list;
|
||||
struct parameter_list *new_path;
|
||||
new_path = (struct parameter_list *) malloc (sizeof *new_path);
|
||||
- new_path->name = (char *) name;
|
||||
+ new_path->name = (char *) malloc(strlen(name) + 1);
|
||||
new_path->best_match = NULL;
|
||||
new_path->name_next = NULL;
|
||||
+ new_path->name_prev = NULL;
|
||||
new_path->freespace_bytes = NULL;
|
||||
new_path->freespace_units = NULL;
|
||||
new_path->freespace_percent = NULL;
|
||||
@@ -74,13 +75,17 @@ np_add_parameter(struct parameter_list **list, const char *name)
|
||||
new_path->dused_inodes_percent = 0;
|
||||
new_path->dfree_inodes_percent = 0;
|
||||
|
||||
+ strcpy(new_path->name, name);
|
||||
+
|
||||
if (current == NULL) {
|
||||
*list = new_path;
|
||||
+ new_path->name_prev = NULL;
|
||||
} else {
|
||||
while (current->name_next) {
|
||||
current = current->name_next;
|
||||
}
|
||||
current->name_next = new_path;
|
||||
+ new_path->name_prev = current;
|
||||
}
|
||||
return new_path;
|
||||
}
|
||||
@@ -89,6 +94,9 @@ np_add_parameter(struct parameter_list **list, const char *name)
|
||||
struct parameter_list *
|
||||
np_del_parameter(struct parameter_list *item, struct parameter_list *prev)
|
||||
{
|
||||
+ if (item == NULL) {
|
||||
+ return NULL;
|
||||
+ }
|
||||
struct parameter_list *next;
|
||||
|
||||
if (item->name_next)
|
||||
@@ -96,10 +104,17 @@ np_del_parameter(struct parameter_list *item, struct parameter_list *prev)
|
||||
else
|
||||
next = NULL;
|
||||
|
||||
- free(item);
|
||||
+ if (next)
|
||||
+ next->name_prev = prev;
|
||||
+
|
||||
if (prev)
|
||||
prev->name_next = next;
|
||||
|
||||
+ if (item->name) {
|
||||
+ free(item->name);
|
||||
+ }
|
||||
+ free(item);
|
||||
+
|
||||
return next;
|
||||
}
|
||||
|
||||
diff --git a/lib/utils_disk.h b/lib/utils_disk.h
|
||||
index bf52e4ce9..3b5a45f86 100644
|
||||
--- a/lib/utils_disk.h
|
||||
+++ b/lib/utils_disk.h
|
||||
@@ -24,6 +24,7 @@ struct parameter_list
|
||||
char *group;
|
||||
struct mount_entry *best_match;
|
||||
struct parameter_list *name_next;
|
||||
+ struct parameter_list *name_prev;
|
||||
uintmax_t total, available, available_to_root, used,
|
||||
inodes_free, inodes_free_to_root, inodes_used, inodes_total;
|
||||
double dfree_pct, dused_pct;
|
||||
|
||||
From ba78c32018658608a31c293beef89ec82b9ba9d3 Mon Sep 17 00:00:00 2001
|
||||
From: Kristian Schuster <116557017+KriSchu@users.noreply.github.com>
|
||||
Date: Sun, 19 Feb 2023 22:49:30 +0100
|
||||
Subject: [PATCH 5/9] check_disk: still allow check of available disks with
|
||||
ignore-missing param used
|
||||
|
||||
Also add reporting of ignored paths. When paths are provided by -p and/ or -r and
|
||||
one path does not match a mounted disk, checking available disks is still
|
||||
possible. Paths provided by -p are reported as ignored, when not available. Due
|
||||
to code structure, this is not possible for -r unfortunately.
|
||||
---
|
||||
plugins/check_disk.c | 103 ++++++++++++++++++++++++++++++++-----------
|
||||
1 file changed, 78 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/plugins/check_disk.c b/plugins/check_disk.c
|
||||
index 8df9e7ec8..c1cfb13c0 100644
|
||||
--- a/plugins/check_disk.c
|
||||
+++ b/plugins/check_disk.c
|
||||
@@ -117,7 +117,7 @@ enum
|
||||
};
|
||||
|
||||
#ifdef _AIX
|
||||
- #pragma alloca
|
||||
+#pragma alloca
|
||||
#endif
|
||||
|
||||
int process_arguments (int, char **);
|
||||
@@ -127,7 +127,7 @@ int validate_arguments (uintmax_t, uintmax_t, double, double, double, double, ch
|
||||
void print_help (void);
|
||||
void print_usage (void);
|
||||
double calculate_percent(uintmax_t, uintmax_t);
|
||||
-void stat_path (struct parameter_list *p);
|
||||
+bool stat_path (struct parameter_list *p);
|
||||
void get_stats (struct parameter_list *p, struct fs_usage *fsp);
|
||||
void get_path_stats (struct parameter_list *p, struct fs_usage *fsp);
|
||||
|
||||
@@ -157,6 +157,7 @@ char *crit_usedinodes_percent = NULL;
|
||||
char *warn_freeinodes_percent = NULL;
|
||||
char *crit_freeinodes_percent = NULL;
|
||||
int path_selected = FALSE;
|
||||
+int path_ignored = FALSE;
|
||||
char *group = NULL;
|
||||
struct stat *stat_buf;
|
||||
struct name_list *seen = NULL;
|
||||
@@ -168,10 +169,12 @@ main (int argc, char **argv)
|
||||
int result = STATE_UNKNOWN;
|
||||
int disk_result = STATE_UNKNOWN;
|
||||
char *output;
|
||||
+ char *ignored;
|
||||
char *details;
|
||||
char *perf;
|
||||
char *perf_ilabel;
|
||||
char *preamble;
|
||||
+ char *ignored_preamble;
|
||||
char *flag_header;
|
||||
int temp_result;
|
||||
|
||||
@@ -183,8 +186,10 @@ main (int argc, char **argv)
|
||||
char mountdir[32];
|
||||
#endif
|
||||
|
||||
- preamble = strdup (" - free space:");
|
||||
+ preamble = strdup (" free space:");
|
||||
+ ignored_preamble = strdup (" ignored paths:");
|
||||
output = strdup ("");
|
||||
+ ignored = strdup ("");
|
||||
details = strdup ("");
|
||||
perf = strdup ("");
|
||||
perf_ilabel = strdup ("");
|
||||
@@ -205,7 +210,7 @@ main (int argc, char **argv)
|
||||
/* If a list of paths has not been selected, find entire
|
||||
mount list and create list of paths
|
||||
*/
|
||||
- if (path_selected == FALSE) {
|
||||
+ if (path_selected == FALSE && path_ignored == FALSE) {
|
||||
for (me = mount_list; me; me = me->me_next) {
|
||||
if (! (path = np_find_parameter(path_select_list, me->me_mountdir))) {
|
||||
path = np_add_parameter(&path_select_list, me->me_mountdir);
|
||||
@@ -215,19 +220,40 @@ main (int argc, char **argv)
|
||||
set_all_thresholds(path);
|
||||
}
|
||||
}
|
||||
- np_set_best_match(path_select_list, mount_list, exact_match);
|
||||
+
|
||||
+ if (path_ignored == FALSE) {
|
||||
+ np_set_best_match(path_select_list, mount_list, exact_match);
|
||||
+ }
|
||||
|
||||
/* Error if no match found for specified paths */
|
||||
temp_list = path_select_list;
|
||||
|
||||
- while (temp_list) {
|
||||
- if (! temp_list->best_match && ignore_missing == 1) {
|
||||
- die (STATE_OK, _("DISK %s: %s not found (ignoring)\n"), _("OK"), temp_list->name);
|
||||
- } else if (! temp_list->best_match) {
|
||||
- die (STATE_CRITICAL, _("DISK %s: %s not found\n"), _("CRITICAL"), temp_list->name);
|
||||
+ while (path_select_list) {
|
||||
+ if (! path_select_list->best_match && ignore_missing == 1) {
|
||||
+ /* If the first element will be deleted, the temp_list must be updated with the new start address as well */
|
||||
+ if (path_select_list == temp_list) {
|
||||
+ temp_list = path_select_list->name_next;
|
||||
+ }
|
||||
+ /* Add path argument to list of ignored paths to inform about missing paths being ignored and not alerted */
|
||||
+ xasprintf (&ignored, "%s %s;", ignored, path_select_list->name);
|
||||
+ /* Delete the path from the list so that it is not stat-checked later in the code. */
|
||||
+ path_select_list = np_del_parameter(path_select_list, path_select_list->name_prev);
|
||||
+ } else if (! path_select_list->best_match) {
|
||||
+ /* Without --ignore-missing option, exit with Critical state. */
|
||||
+ die (STATE_CRITICAL, _("DISK %s: %s not found\n"), _("CRITICAL"), path_select_list->name);
|
||||
+ } else {
|
||||
+ /* Continue jumping through the list */
|
||||
+ path_select_list = path_select_list->name_next;
|
||||
}
|
||||
+ }
|
||||
+
|
||||
+ path_select_list = temp_list;
|
||||
|
||||
- temp_list = temp_list->name_next;
|
||||
+ if (! path_select_list && ignore_missing == 1) {
|
||||
+ result = STATE_OK;
|
||||
+ if (verbose >= 2) {
|
||||
+ printf ("None of the provided paths were found\n");
|
||||
+ }
|
||||
}
|
||||
|
||||
/* Process for every path in list */
|
||||
@@ -246,6 +272,10 @@ main (int argc, char **argv)
|
||||
|
||||
me = path->best_match;
|
||||
|
||||
+ if (!me) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
#ifdef __CYGWIN__
|
||||
if (strncmp(path->name, "/cygdrive/", 10) != 0 || strlen(path->name) > 11)
|
||||
continue;
|
||||
@@ -264,8 +294,12 @@ main (int argc, char **argv)
|
||||
if (path->group == NULL) {
|
||||
/* Skip remote filesystems if we're not interested in them */
|
||||
if (me->me_remote && show_local_fs) {
|
||||
- if (stat_remote_fs)
|
||||
- stat_path(path);
|
||||
+ if (stat_remote_fs) {
|
||||
+ if (!stat_path(path) && ignore_missing == 1) {
|
||||
+ result = STATE_OK;
|
||||
+ xasprintf (&ignored, "%s %s;", ignored, path->name);
|
||||
+ }
|
||||
+ }
|
||||
continue;
|
||||
/* Skip pseudo fs's if we haven't asked for all fs's */
|
||||
} else if (me->me_dummy && !show_all_fs) {
|
||||
@@ -284,7 +318,13 @@ main (int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
- stat_path(path);
|
||||
+ if (!stat_path(path)) {
|
||||
+ if (ignore_missing == 1) {
|
||||
+ result = STATE_OK;
|
||||
+ xasprintf (&ignored, "%s %s;", ignored, path->name);
|
||||
+ }
|
||||
+ continue;
|
||||
+ }
|
||||
get_fs_usage (me->me_mountdir, me->me_devname, &fsp);
|
||||
|
||||
if (fsp.fsu_blocks && strcmp ("none", me->me_mountdir)) {
|
||||
@@ -415,8 +455,12 @@ main (int argc, char **argv)
|
||||
if (verbose >= 2)
|
||||
xasprintf (&output, "%s%s", output, details);
|
||||
|
||||
+ if (strcmp(output, "") == 0) {
|
||||
+ preamble = "";
|
||||
+ xasprintf (&output, " No disks were found for provided parameters;");
|
||||
+ }
|
||||
|
||||
- printf ("DISK %s%s%s|%s\n", state_text (result), (erronly && result==STATE_OK) ? "" : preamble, output, perf);
|
||||
+ printf ("DISK %s -%s%s%s%s|%s\n", state_text (result), ((erronly && result==STATE_OK)) ? "" : preamble, output, (strcmp(ignored, "") == 0) ? "" : ignored_preamble, ignored, perf);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -637,12 +681,19 @@ process_arguments (int argc, char **argv)
|
||||
/* add parameter if not found. overwrite thresholds if path has already been added */
|
||||
if (! (se = np_find_parameter(path_select_list, optarg))) {
|
||||
se = np_add_parameter(&path_select_list, optarg);
|
||||
+
|
||||
+ if (stat(optarg, &stat_buf[0]) && ignore_missing == 1) {
|
||||
+ path_ignored = TRUE;
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
se->group = group;
|
||||
set_all_thresholds(se);
|
||||
|
||||
/* With autofs, it is required to stat() the path before re-populating the mount_list */
|
||||
- stat_path(se);
|
||||
+ if (!stat_path(se)) {
|
||||
+ break;
|
||||
+ }
|
||||
/* NB: We can't free the old mount_list "just like that": both list pointers and struct
|
||||
* pointers are copied around. One of the reason it wasn't done yet is that other parts
|
||||
* of check_disk need the same kind of cleanup so it'd better be done as a whole */
|
||||
@@ -761,10 +812,11 @@ process_arguments (int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
- if (!fnd && ignore_missing == 1)
|
||||
- die (STATE_OK, "DISK %s: %s - %s\n",_("OK"),
|
||||
- _("Regular expression did not match any path or disk (ignoring)"), optarg);
|
||||
- else if (!fnd)
|
||||
+ if (!fnd && ignore_missing == 1) {
|
||||
+ path_ignored = TRUE;
|
||||
+ /* path_selected = TRUE;*/
|
||||
+ break;
|
||||
+ } else if (!fnd)
|
||||
die (STATE_UNKNOWN, "DISK %s: %s - %s\n",_("UNKNOWN"),
|
||||
_("Regular expression did not match any path or disk"), optarg);
|
||||
|
||||
@@ -936,7 +988,7 @@ print_help (void)
|
||||
printf (" %s\n", _("Regular expression to ignore selected path or partition (may be repeated)"));
|
||||
printf (" %s\n", "--ignore-missing");
|
||||
printf (" %s\n", _("Return OK if no filesystem matches, filesystem does not exist or is inaccessible."));
|
||||
- printf (" %s\n", _("(Provide this option before -r / --ereg-path if used)"));
|
||||
+ printf (" %s\n", _("(Provide this option before -p / -r / --ereg-path if used)"));
|
||||
printf (UT_PLUG_TIMEOUT, DEFAULT_SOCKET_TIMEOUT);
|
||||
printf (" %s\n", "-u, --units=STRING");
|
||||
printf (" %s\n", _("Choose bytes, kB, MB, GB, TB (default: MB)"));
|
||||
@@ -970,7 +1022,7 @@ print_usage (void)
|
||||
printf ("[-t timeout] [-u unit] [-v] [-X type] [-N type]\n");
|
||||
}
|
||||
|
||||
-void
|
||||
+bool
|
||||
stat_path (struct parameter_list *p)
|
||||
{
|
||||
/* Stat entry to check that dir exists and is accessible */
|
||||
@@ -980,13 +1032,13 @@ stat_path (struct parameter_list *p)
|
||||
if (verbose >= 3)
|
||||
printf("stat failed on %s\n", p->name);
|
||||
if (ignore_missing == 1) {
|
||||
- printf("DISK %s - ", _("OK"));
|
||||
- die (STATE_OK, _("%s %s: %s\n"), p->name, _("is not accessible (ignoring)"), strerror(errno));
|
||||
+ return false;
|
||||
} else {
|
||||
printf("DISK %s - ", _("CRITICAL"));
|
||||
die (STATE_CRITICAL, _("%s %s: %s\n"), p->name, _("is not accessible"), strerror(errno));
|
||||
}
|
||||
}
|
||||
+ return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -1006,7 +1058,8 @@ get_stats (struct parameter_list *p, struct fs_usage *fsp) {
|
||||
continue;
|
||||
#endif
|
||||
if (p_list->group && ! (strcmp(p_list->group, p->group))) {
|
||||
- stat_path(p_list);
|
||||
+ if (! stat_path(p_list))
|
||||
+ continue;
|
||||
get_fs_usage (p_list->best_match->me_mountdir, p_list->best_match->me_devname, &tmpfsp);
|
||||
get_path_stats(p_list, &tmpfsp);
|
||||
if (verbose >= 3)
|
||||
|
||||
From ca3d59cd6918c9e2739e783b721d4c1122640fd3 Mon Sep 17 00:00:00 2001
|
||||
From: Kristian Schuster <116557017+KriSchu@users.noreply.github.com>
|
||||
Date: Sun, 19 Feb 2023 23:00:21 +0100
|
||||
Subject: [PATCH 6/9] check_disk: add new tests for new ignore-missing feature
|
||||
|
||||
---
|
||||
plugins/t/check_disk.t | 20 +++++++++++++++-----
|
||||
1 file changed, 15 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/plugins/t/check_disk.t b/plugins/t/check_disk.t
|
||||
index a534fd4a5..275db70d8 100644
|
||||
--- a/plugins/t/check_disk.t
|
||||
+++ b/plugins/t/check_disk.t
|
||||
@@ -23,7 +23,7 @@ my $mountpoint2_valid = getTestParameter( "NP_MOUNTPOINT2_VALID", "Path to anoth
|
||||
if ($mountpoint_valid eq "" or $mountpoint2_valid eq "") {
|
||||
plan skip_all => "Need 2 mountpoints to test";
|
||||
} else {
|
||||
- plan tests => 84;
|
||||
+ plan tests => 86;
|
||||
}
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
@@ -355,14 +355,24 @@ like( $result->output, qr/$mountpoint2_valid/,"ignore: output data does have $mo
|
||||
# ignore-missing: exit okay, when fs is not accessible
|
||||
$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -p /bob");
|
||||
cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for not existing filesystem /bob");
|
||||
-like( $result->output, '/^DISK OK - /bob is not accessible .*$/', 'Output OK');
|
||||
+like( $result->output, '/^DISK OK - No disks were found for provided parameters; ignored paths: /bob;.*$/', 'Output OK');
|
||||
|
||||
# ignore-missing: exit okay, when regex does not match
|
||||
$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -r /bob");
|
||||
cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for regular expression not matching");
|
||||
-like( $result->output, '/^DISK OK: Regular expression did not match any path or disk.*$/', 'Output OK');
|
||||
+like( $result->output, '/^DISK OK - No disks were found for provided parameters;.*$/', 'Output OK');
|
||||
|
||||
# ignore-missing: exit okay, when fs with exact match (-E) is not found
|
||||
-$result = NPTest->testCmd( "./check_disk --ignore-missing -E -w 0% -c 0% -p /etc");
|
||||
+$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -E -p /etc");
|
||||
cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay when exact match does not find fs");
|
||||
-like( $result->output, '/^DISK OK: /etc not found.*$/', 'Output OK');
|
||||
+like( $result->output, '/^DISK OK - No disks were found for provided parameters; ignored paths: /etc;.*$/', 'Output OK');
|
||||
+
|
||||
+# ignore-missing: exit okay, when checking one existing fs and one non-existing fs (regex)
|
||||
+$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -r '/bob' -r '^/$'");
|
||||
+cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for regular expression not matching");
|
||||
+like( $result->output, '/^DISK OK - free space: / .*$/', 'Output OK');
|
||||
+
|
||||
+# ignore-missing: exit okay, when checking one existing fs and one non-existing fs (path)
|
||||
+$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -p '/bob' -p '/'");
|
||||
+cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for regular expression not matching");
|
||||
+like( $result->output, '/^DISK OK - free space: / .*; ignored paths: /bob;.*$/', 'Output OK');
|
||||
\ No newline at end of file
|
||||
|
||||
From a58293a0c288ee0e050c79715073da9fbdfc4c58 Mon Sep 17 00:00:00 2001
|
||||
From: Kristian Schuster <116557017+KriSchu@users.noreply.github.com>
|
||||
Date: Mon, 20 Feb 2023 01:27:23 +0100
|
||||
Subject: [PATCH 7/9] check_disk: fix tests by setting correct test number and
|
||||
escaping line end regex
|
||||
|
||||
---
|
||||
plugins/t/check_disk.t | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/plugins/t/check_disk.t b/plugins/t/check_disk.t
|
||||
index 275db70d8..73f1e3748 100644
|
||||
--- a/plugins/t/check_disk.t
|
||||
+++ b/plugins/t/check_disk.t
|
||||
@@ -23,7 +23,7 @@ my $mountpoint2_valid = getTestParameter( "NP_MOUNTPOINT2_VALID", "Path to anoth
|
||||
if ($mountpoint_valid eq "" or $mountpoint2_valid eq "") {
|
||||
plan skip_all => "Need 2 mountpoints to test";
|
||||
} else {
|
||||
- plan tests => 86;
|
||||
+ plan tests => 88;
|
||||
}
|
||||
|
||||
$result = NPTest->testCmd(
|
||||
@@ -126,7 +126,7 @@ my $free_mb_on_all = $free_mb_on_mp1 + $free_mb_on_mp2;
|
||||
|
||||
|
||||
$result = NPTest->testCmd( "./check_disk -e -w 1 -c 1 -p $more_free" );
|
||||
-is( $result->only_output, "DISK OK", "No print out of disks with -e for OKs");
|
||||
+is( $result->only_output, "DISK OK - No disks were found for provided parameters;", "No print out of disks with -e for OKs");
|
||||
|
||||
$result = NPTest->testCmd( "./check_disk 100 100 $more_free" );
|
||||
cmp_ok( $result->return_code, '==', 0, "Old syntax okay" );
|
||||
@@ -368,9 +368,9 @@ cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay when exact m
|
||||
like( $result->output, '/^DISK OK - No disks were found for provided parameters; ignored paths: /etc;.*$/', 'Output OK');
|
||||
|
||||
# ignore-missing: exit okay, when checking one existing fs and one non-existing fs (regex)
|
||||
-$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -r '/bob' -r '^/$'");
|
||||
+$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -r '/bob' -r '^/\$'");
|
||||
cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for regular expression not matching");
|
||||
-like( $result->output, '/^DISK OK - free space: / .*$/', 'Output OK');
|
||||
+like( $result->output, '/^DISK OK - free space: \/ .*$/', 'Output OK');
|
||||
|
||||
# ignore-missing: exit okay, when checking one existing fs and one non-existing fs (path)
|
||||
$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -p '/bob' -p '/'");
|
||||
|
||||
From e102b8a49e857a474db516455d2e871e6834ae34 Mon Sep 17 00:00:00 2001
|
||||
From: Kristian Schuster <116557017+KriSchu@users.noreply.github.com>
|
||||
Date: Mon, 20 Feb 2023 02:03:01 +0100
|
||||
Subject: [PATCH 8/9] check_disk: fix ugly output with -e option and adapt
|
||||
tests accordingly
|
||||
|
||||
---
|
||||
plugins/check_disk.c | 10 +++++-----
|
||||
plugins/t/check_disk.t | 8 ++++----
|
||||
2 files changed, 9 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/plugins/check_disk.c b/plugins/check_disk.c
|
||||
index d32841d8e..c52d1df48 100644
|
||||
--- a/plugins/check_disk.c
|
||||
+++ b/plugins/check_disk.c
|
||||
@@ -186,8 +186,8 @@ main (int argc, char **argv)
|
||||
char mountdir[32];
|
||||
#endif
|
||||
|
||||
- preamble = strdup (" free space:");
|
||||
- ignored_preamble = strdup (" ignored paths:");
|
||||
+ preamble = strdup (" - free space:");
|
||||
+ ignored_preamble = strdup (" - ignored paths:");
|
||||
output = strdup ("");
|
||||
ignored = strdup ("");
|
||||
details = strdup ("");
|
||||
@@ -455,12 +455,12 @@ main (int argc, char **argv)
|
||||
if (verbose >= 2)
|
||||
xasprintf (&output, "%s%s", output, details);
|
||||
|
||||
- if (strcmp(output, "") == 0) {
|
||||
+ if (strcmp(output, "") == 0 && ! erronly) {
|
||||
preamble = "";
|
||||
- xasprintf (&output, " No disks were found for provided parameters;");
|
||||
+ xasprintf (&output, " - No disks were found for provided parameters;");
|
||||
}
|
||||
|
||||
- printf ("DISK %s -%s%s%s%s|%s\n", state_text (result), ((erronly && result==STATE_OK)) ? "" : preamble, output, (strcmp(ignored, "") == 0) ? "" : ignored_preamble, ignored, perf);
|
||||
+ printf ("DISK %s%s%s%s%s|%s\n", state_text (result), ((erronly && result==STATE_OK)) ? "" : preamble, output, (strcmp(ignored, "") == 0) ? "" : ignored_preamble, ignored, perf);
|
||||
return result;
|
||||
}
|
||||
|
||||
diff --git a/plugins/t/check_disk.t b/plugins/t/check_disk.t
|
||||
index 73f1e3748..c8f08f515 100644
|
||||
--- a/plugins/t/check_disk.t
|
||||
+++ b/plugins/t/check_disk.t
|
||||
@@ -126,7 +126,7 @@ my $free_mb_on_all = $free_mb_on_mp1 + $free_mb_on_mp2;
|
||||
|
||||
|
||||
$result = NPTest->testCmd( "./check_disk -e -w 1 -c 1 -p $more_free" );
|
||||
-is( $result->only_output, "DISK OK - No disks were found for provided parameters;", "No print out of disks with -e for OKs");
|
||||
+is( $result->only_output, "DISK OK", "No print out of disks with -e for OKs");
|
||||
|
||||
$result = NPTest->testCmd( "./check_disk 100 100 $more_free" );
|
||||
cmp_ok( $result->return_code, '==', 0, "Old syntax okay" );
|
||||
@@ -355,7 +355,7 @@ like( $result->output, qr/$mountpoint2_valid/,"ignore: output data does have $mo
|
||||
# ignore-missing: exit okay, when fs is not accessible
|
||||
$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -p /bob");
|
||||
cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for not existing filesystem /bob");
|
||||
-like( $result->output, '/^DISK OK - No disks were found for provided parameters; ignored paths: /bob;.*$/', 'Output OK');
|
||||
+like( $result->output, '/^DISK OK - No disks were found for provided parameters; - ignored paths: /bob;.*$/', 'Output OK');
|
||||
|
||||
# ignore-missing: exit okay, when regex does not match
|
||||
$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -r /bob");
|
||||
@@ -365,7 +365,7 @@ like( $result->output, '/^DISK OK - No disks were found for provided parameters;
|
||||
# ignore-missing: exit okay, when fs with exact match (-E) is not found
|
||||
$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -E -p /etc");
|
||||
cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay when exact match does not find fs");
|
||||
-like( $result->output, '/^DISK OK - No disks were found for provided parameters; ignored paths: /etc;.*$/', 'Output OK');
|
||||
+like( $result->output, '/^DISK OK - No disks were found for provided parameters; - ignored paths: /etc;.*$/', 'Output OK');
|
||||
|
||||
# ignore-missing: exit okay, when checking one existing fs and one non-existing fs (regex)
|
||||
$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -r '/bob' -r '^/\$'");
|
||||
@@ -375,4 +375,4 @@ like( $result->output, '/^DISK OK - free space: \/ .*$/', 'Output OK');
|
||||
# ignore-missing: exit okay, when checking one existing fs and one non-existing fs (path)
|
||||
$result = NPTest->testCmd( "./check_disk --ignore-missing -w 0% -c 0% -p '/bob' -p '/'");
|
||||
cmp_ok( $result->return_code, '==', 0, "ignore-missing: return okay for regular expression not matching");
|
||||
-like( $result->output, '/^DISK OK - free space: / .*; ignored paths: /bob;.*$/', 'Output OK');
|
||||
\ No newline at end of file
|
||||
+like( $result->output, '/^DISK OK - free space: / .*; - ignored paths: /bob;.*$/', 'Output OK');
|
||||
\ No newline at end of file
|
||||
|
||||
From 3e7da5f970d73df91fad32f4dce259d30cdbbd65 Mon Sep 17 00:00:00 2001
|
||||
From: Kristian Schuster <116557017+KriSchu@users.noreply.github.com>
|
||||
Date: Mon, 6 Mar 2023 14:03:10 +0100
|
||||
Subject: [PATCH 9/9] check_disk: use cleaner code for ignore-missing option -
|
||||
use datatype bool for new vars ignore_missing and path_ignored instead of int
|
||||
- directly initialize preamble and ignored_preamble with their strings
|
||||
|
||||
---
|
||||
plugins/check_disk.c | 34 ++++++++++++++++------------------
|
||||
1 file changed, 16 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/plugins/check_disk.c b/plugins/check_disk.c
|
||||
index c52d1df48..bd84c8257 100644
|
||||
--- a/plugins/check_disk.c
|
||||
+++ b/plugins/check_disk.c
|
||||
@@ -141,7 +141,7 @@ int verbose = 0;
|
||||
int erronly = FALSE;
|
||||
int display_mntp = FALSE;
|
||||
int exact_match = FALSE;
|
||||
-int ignore_missing = FALSE;
|
||||
+bool ignore_missing = false;
|
||||
int freespace_ignore_reserved = FALSE;
|
||||
int display_inodes_perfdata = FALSE;
|
||||
char *warn_freespace_units = NULL;
|
||||
@@ -157,7 +157,7 @@ char *crit_usedinodes_percent = NULL;
|
||||
char *warn_freeinodes_percent = NULL;
|
||||
char *crit_freeinodes_percent = NULL;
|
||||
int path_selected = FALSE;
|
||||
-int path_ignored = FALSE;
|
||||
+bool path_ignored = false;
|
||||
char *group = NULL;
|
||||
struct stat *stat_buf;
|
||||
struct name_list *seen = NULL;
|
||||
@@ -173,8 +173,8 @@ main (int argc, char **argv)
|
||||
char *details;
|
||||
char *perf;
|
||||
char *perf_ilabel;
|
||||
- char *preamble;
|
||||
- char *ignored_preamble;
|
||||
+ char *preamble = " - free space:";
|
||||
+ char *ignored_preamble = " - ignored paths:";
|
||||
char *flag_header;
|
||||
int temp_result;
|
||||
|
||||
@@ -186,8 +186,6 @@ main (int argc, char **argv)
|
||||
char mountdir[32];
|
||||
#endif
|
||||
|
||||
- preamble = strdup (" - free space:");
|
||||
- ignored_preamble = strdup (" - ignored paths:");
|
||||
output = strdup ("");
|
||||
ignored = strdup ("");
|
||||
details = strdup ("");
|
||||
@@ -210,7 +208,7 @@ main (int argc, char **argv)
|
||||
/* If a list of paths has not been selected, find entire
|
||||
mount list and create list of paths
|
||||
*/
|
||||
- if (path_selected == FALSE && path_ignored == FALSE) {
|
||||
+ if (path_selected == FALSE && path_ignored == false) {
|
||||
for (me = mount_list; me; me = me->me_next) {
|
||||
if (! (path = np_find_parameter(path_select_list, me->me_mountdir))) {
|
||||
path = np_add_parameter(&path_select_list, me->me_mountdir);
|
||||
@@ -221,7 +219,7 @@ main (int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
- if (path_ignored == FALSE) {
|
||||
+ if (path_ignored == false) {
|
||||
np_set_best_match(path_select_list, mount_list, exact_match);
|
||||
}
|
||||
|
||||
@@ -229,7 +227,7 @@ main (int argc, char **argv)
|
||||
temp_list = path_select_list;
|
||||
|
||||
while (path_select_list) {
|
||||
- if (! path_select_list->best_match && ignore_missing == 1) {
|
||||
+ if (! path_select_list->best_match && ignore_missing == true) {
|
||||
/* If the first element will be deleted, the temp_list must be updated with the new start address as well */
|
||||
if (path_select_list == temp_list) {
|
||||
temp_list = path_select_list->name_next;
|
||||
@@ -249,7 +247,7 @@ main (int argc, char **argv)
|
||||
|
||||
path_select_list = temp_list;
|
||||
|
||||
- if (! path_select_list && ignore_missing == 1) {
|
||||
+ if (! path_select_list && ignore_missing == true) {
|
||||
result = STATE_OK;
|
||||
if (verbose >= 2) {
|
||||
printf ("None of the provided paths were found\n");
|
||||
@@ -295,7 +293,7 @@ main (int argc, char **argv)
|
||||
/* Skip remote filesystems if we're not interested in them */
|
||||
if (me->me_remote && show_local_fs) {
|
||||
if (stat_remote_fs) {
|
||||
- if (!stat_path(path) && ignore_missing == 1) {
|
||||
+ if (!stat_path(path) && ignore_missing == true) {
|
||||
result = STATE_OK;
|
||||
xasprintf (&ignored, "%s %s;", ignored, path->name);
|
||||
}
|
||||
@@ -319,7 +317,7 @@ main (int argc, char **argv)
|
||||
}
|
||||
|
||||
if (!stat_path(path)) {
|
||||
- if (ignore_missing == 1) {
|
||||
+ if (ignore_missing == true) {
|
||||
result = STATE_OK;
|
||||
xasprintf (&ignored, "%s %s;", ignored, path->name);
|
||||
}
|
||||
@@ -682,8 +680,8 @@ process_arguments (int argc, char **argv)
|
||||
if (! (se = np_find_parameter(path_select_list, optarg))) {
|
||||
se = np_add_parameter(&path_select_list, optarg);
|
||||
|
||||
- if (stat(optarg, &stat_buf[0]) && ignore_missing == 1) {
|
||||
- path_ignored = TRUE;
|
||||
+ if (stat(optarg, &stat_buf[0]) && ignore_missing == true) {
|
||||
+ path_ignored = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -775,7 +773,7 @@ process_arguments (int argc, char **argv)
|
||||
break;
|
||||
|
||||
case IGNORE_MISSING:
|
||||
- ignore_missing = 1;
|
||||
+ ignore_missing = true;
|
||||
break;
|
||||
case 'A':
|
||||
optarg = strdup(".*");
|
||||
@@ -812,8 +810,8 @@ process_arguments (int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
- if (!fnd && ignore_missing == 1) {
|
||||
- path_ignored = TRUE;
|
||||
+ if (!fnd && ignore_missing == true) {
|
||||
+ path_ignored = true;
|
||||
/* path_selected = TRUE;*/
|
||||
break;
|
||||
} else if (!fnd)
|
||||
@@ -1031,7 +1029,7 @@ stat_path (struct parameter_list *p)
|
||||
if (stat (p->name, &stat_buf[0])) {
|
||||
if (verbose >= 3)
|
||||
printf("stat failed on %s\n", p->name);
|
||||
- if (ignore_missing == 1) {
|
||||
+ if (ignore_missing == true) {
|
||||
return false;
|
||||
} else {
|
||||
printf("DISK %s - ", _("CRITICAL"));
|
168
debian/patches/33_check_procs_exclude-process
vendored
Normal file
168
debian/patches/33_check_procs_exclude-process
vendored
Normal file
|
@ -0,0 +1,168 @@
|
|||
From 691376d3a16da06e34740593d9a1de0e00cbffb8 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Kujau <lists@nerdbynature.de>
|
||||
Date: Mon, 20 Mar 2023 11:35:01 +0100
|
||||
Subject: [PATCH 1/2] check_procs: Implement --exclude-process to exclude
|
||||
specific processes.
|
||||
|
||||
Signed-off-by: Christian Kujau <lists@nerdbynature.de>
|
||||
---
|
||||
plugins/check_procs.c | 47 +++++++++++++++++++++++++++++++++++++++++--
|
||||
1 file changed, 45 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/plugins/check_procs.c b/plugins/check_procs.c
|
||||
index a025ee891..d672dd44e 100644
|
||||
--- a/plugins/check_procs.c
|
||||
+++ b/plugins/check_procs.c
|
||||
@@ -70,6 +70,7 @@ int options = 0; /* bitmask of filter criteria to test against */
|
||||
#define PCPU 256
|
||||
#define ELAPSED 512
|
||||
#define EREG_ARGS 1024
|
||||
+#define EXCLUDE_PROGS 2048
|
||||
|
||||
#define KTHREAD_PARENT "kthreadd" /* the parent process of kernel threads:
|
||||
ppid of procs are compared to pid of this proc*/
|
||||
@@ -93,6 +94,9 @@ int rss;
|
||||
float pcpu;
|
||||
char *statopts;
|
||||
char *prog;
|
||||
+char *exclude_progs;
|
||||
+char **exclude_progs_arr = NULL;
|
||||
+char exclude_progs_counter = 0;
|
||||
char *args;
|
||||
char *input_filename = NULL;
|
||||
regex_t re_args;
|
||||
@@ -250,6 +254,25 @@ main (int argc, char **argv)
|
||||
continue;
|
||||
}
|
||||
|
||||
+ /* Ignore excluded processes by name */
|
||||
+ if(options & EXCLUDE_PROGS) {
|
||||
+ int found = 0;
|
||||
+ int i = 0;
|
||||
+
|
||||
+ for(i=0; i < (exclude_progs_counter); i++) {
|
||||
+ if(!strcmp(procprog, exclude_progs_arr[i])) {
|
||||
+ found = 1;
|
||||
+ }
|
||||
+ }
|
||||
+ if(found == 0) {
|
||||
+ resultsum |= EXCLUDE_PROGS;
|
||||
+ } else
|
||||
+ {
|
||||
+ if(verbose >= 3)
|
||||
+ printf("excluding - by ignorelist\n");
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
/* filter kernel threads (childs of KTHREAD_PARENT)*/
|
||||
/* TODO adapt for other OSes than GNU/Linux
|
||||
sorry for not doing that, but I've no other OSes to test :-( */
|
||||
@@ -409,6 +432,7 @@ process_arguments (int argc, char **argv)
|
||||
{"input-file", required_argument, 0, CHAR_MAX+2},
|
||||
{"no-kthreads", required_argument, 0, 'k'},
|
||||
{"traditional-filter", no_argument, 0, 'T'},
|
||||
+ {"exclude-process", required_argument, 0, 'X'},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
@@ -417,7 +441,7 @@ process_arguments (int argc, char **argv)
|
||||
strcpy (argv[c], "-t");
|
||||
|
||||
while (1) {
|
||||
- c = getopt_long (argc, argv, "Vvhkt:c:w:p:s:u:C:a:z:r:m:P:T",
|
||||
+ c = getopt_long (argc, argv, "Vvhkt:c:w:p:s:u:C:a:z:r:m:P:T:X:",
|
||||
longopts, &option);
|
||||
|
||||
if (c == -1 || c == EOF)
|
||||
@@ -490,6 +514,23 @@ process_arguments (int argc, char **argv)
|
||||
prog);
|
||||
options |= PROG;
|
||||
break;
|
||||
+ case 'X':
|
||||
+ if(exclude_progs)
|
||||
+ break;
|
||||
+ else
|
||||
+ exclude_progs = optarg;
|
||||
+ xasprintf (&fmt, _("%s%sexclude progs '%s'"), (fmt ? fmt : ""), (options ? ", " : ""),
|
||||
+ exclude_progs);
|
||||
+ char *p = strtok(exclude_progs, ",");
|
||||
+
|
||||
+ while(p){
|
||||
+ exclude_progs_arr = realloc(exclude_progs_arr, sizeof(char*) * ++exclude_progs_counter);
|
||||
+ exclude_progs_arr[exclude_progs_counter-1] = p;
|
||||
+ p = strtok(NULL, ",");
|
||||
+ }
|
||||
+
|
||||
+ options |= EXCLUDE_PROGS;
|
||||
+ break;
|
||||
case 'a': /* args (full path name with args) */
|
||||
/* TODO: allow this to be passed in with --metric */
|
||||
if (args)
|
||||
@@ -745,6 +786,8 @@ print_help (void)
|
||||
printf (" %s\n", _("Only scan for processes with args that contain the regex STRING."));
|
||||
printf (" %s\n", "-C, --command=COMMAND");
|
||||
printf (" %s\n", _("Only scan for exact matches of COMMAND (without path)."));
|
||||
+ printf (" %s\n", "-X, --exclude-process");
|
||||
+ printf (" %s\n", _("Exclude processes which match this comma seperated list"));
|
||||
printf (" %s\n", "-k, --no-kthreads");
|
||||
printf (" %s\n", _("Only scan for non kernel threads (works on Linux only)."));
|
||||
|
||||
@@ -786,5 +829,5 @@ print_usage (void)
|
||||
printf ("%s\n", _("Usage:"));
|
||||
printf ("%s -w <range> -c <range> [-m metric] [-s state] [-p ppid]\n", progname);
|
||||
printf (" [-u user] [-r rss] [-z vsz] [-P %%cpu] [-a argument-array]\n");
|
||||
- printf (" [-C command] [-k] [-t timeout] [-v]\n");
|
||||
+ printf (" [-C command] [-X process_to_exclude] [-k] [-t timeout] [-v]\n");
|
||||
}
|
||||
|
||||
From 7b7037280c36279ea51de07f9a4efea10bcfa24c Mon Sep 17 00:00:00 2001
|
||||
From: Christian Kujau <lists@nerdbynature.de>
|
||||
Date: Tue, 21 Mar 2023 11:26:03 +0100
|
||||
Subject: [PATCH 2/2] check_procs: add a test for the newly added -X option.
|
||||
|
||||
$ make test
|
||||
[...]
|
||||
perl -I .. -I .. ../test.pl
|
||||
No application (check_curl) found for test harness (check_curl.t)
|
||||
No application (check_snmp) found for test harness (check_snmp.t)
|
||||
./t/check_procs.t ...... ok
|
||||
./tests/check_nt.t ..... ok
|
||||
./tests/check_procs.t .. ok
|
||||
All tests successful.
|
||||
Files=4, Tests=73, 8 wallclock secs ( 0.05 usr 0.02 sys + 0.38 cusr
|
||||
0.22 csys = 0.67 CPU)
|
||||
Result: PASS
|
||||
|
||||
Signed-off-by: Christian Kujau <lists@nerdbynature.de>
|
||||
---
|
||||
plugins/tests/check_procs.t | 8 ++++++--
|
||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/plugins/tests/check_procs.t b/plugins/tests/check_procs.t
|
||||
index 3af218f50..b3a0a3015 100755
|
||||
--- a/plugins/tests/check_procs.t
|
||||
+++ b/plugins/tests/check_procs.t
|
||||
@@ -8,7 +8,7 @@ use Test::More;
|
||||
use NPTest;
|
||||
|
||||
if (-x "./check_procs") {
|
||||
- plan tests => 52;
|
||||
+ plan tests => 54;
|
||||
} else {
|
||||
plan skip_all => "No check_procs compiled";
|
||||
}
|
||||
@@ -34,9 +34,13 @@ is( $result->return_code, 0, "Checking no threshold breeched" );
|
||||
is( $result->output, "PROCS OK: 95 processes | procs=95;100;200;0;", "Output correct" );
|
||||
|
||||
$result = NPTest->testCmd( "$command -C launchd -c 5" );
|
||||
-is( $result->return_code, 2, "Checking processes filtered by command name" );
|
||||
+is( $result->return_code, 2, "Checking processes matched by command name" );
|
||||
is( $result->output, "PROCS CRITICAL: 6 processes with command name 'launchd' | procs=6;;5;0;", "Output correct" );
|
||||
|
||||
+$result = NPTest->testCmd( "$command -X bash -c 5" );
|
||||
+is( $result->return_code, 2, "Checking processes excluded by command name" );
|
||||
+is( $result->output, "PROCS CRITICAL: 95 processes with exclude progs 'bash' | procs=95;;5;0;", "Output correct" );
|
||||
+
|
||||
SKIP: {
|
||||
skip 'user with uid 501 required', 4 unless getpwuid(501);
|
||||
|
31
debian/patches/34_check_curl_fix_compare_warning
vendored
Normal file
31
debian/patches/34_check_curl_fix_compare_warning
vendored
Normal file
|
@ -0,0 +1,31 @@
|
|||
From cf90f0de7b3c347a6860b50de6a610bd7132668c Mon Sep 17 00:00:00 2001
|
||||
From: Andreas Baumann <mail@andreasbaumann.cc>
|
||||
Date: Thu, 16 Mar 2023 16:21:46 +0100
|
||||
Subject: [PATCH] check_curk: including netinet/in.h (for FreeBSD), fixed an
|
||||
ambigous compare warning
|
||||
|
||||
---
|
||||
plugins/check_curl.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/plugins/check_curl.c b/plugins/check_curl.c
|
||||
index e5be1ad56..c51914a9a 100644
|
||||
--- a/plugins/check_curl.c
|
||||
+++ b/plugins/check_curl.c
|
||||
@@ -55,6 +55,7 @@ const char *email = "devel@monitoring-plugins.org";
|
||||
#include "uriparser/Uri.h"
|
||||
|
||||
#include <arpa/inet.h>
|
||||
+#include <netinet/in.h>
|
||||
|
||||
#if defined(HAVE_SSL) && defined(USE_OPENSSL)
|
||||
#include <openssl/opensslv.h>
|
||||
@@ -541,7 +542,7 @@ check_http (void)
|
||||
/* compose URL: use the address we want to connect to, set Host: header later */
|
||||
snprintf (url, DEFAULT_BUFFER_SIZE, "%s://%s:%d%s",
|
||||
use_ssl ? "https" : "http",
|
||||
- use_ssl & host_name != NULL ? host_name : server_address,
|
||||
+ ( use_ssl & ( host_name != NULL ) ) ? host_name : server_address,
|
||||
server_port,
|
||||
server_url
|
||||
);
|
19
debian/patches/series
vendored
19
debian/patches/series
vendored
|
@ -1,4 +1,23 @@
|
|||
02_check_icmp_links
|
||||
03_epn
|
||||
# commited upstream
|
||||
10_check_http_chunked_wo_actual_content
|
||||
11_fallback_for_gnutls
|
||||
12_check_curl_improvements
|
||||
13_check_icmp_improvements
|
||||
14_check_curl_fix_SSL_with_multiple_IPs
|
||||
15_check_swap_remove_includes
|
||||
16_check_snmp_disable_multiplier_when_unused
|
||||
17_fix_exit_codes
|
||||
18_check_mysql_fix_typo
|
||||
19_check_nwstat_fix_typo
|
||||
20_chech_nt_fix_encoding
|
||||
21_check_pgsql_extra_output
|
||||
22_check_disk_avoid_mount
|
||||
23_check_mysql_fix_error_handling
|
||||
# feature patches
|
||||
30_check_radius_radcli_1.3.1_support
|
||||
31_checl_mailq_separate_submission_queue
|
||||
32_check_disk_add_ignore_missing
|
||||
33_check_procs_exclude-process
|
||||
34_check_curl_fix_compare_warning
|
||||
|
|
2398
gl/Makefile.am
2398
gl/Makefile.am
File diff suppressed because it is too large
Load diff
5543
gl/Makefile.in
5543
gl/Makefile.in
File diff suppressed because it is too large
Load diff
|
@ -1,50 +0,0 @@
|
|||
/* A C macro for declaring that a function does not return.
|
||||
Copyright (C) 2011-2023 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify it
|
||||
under the terms of the GNU Lesser 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _Noreturn
|
||||
# if (defined __cplusplus \
|
||||
&& ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \
|
||||
|| (defined _MSC_VER && 1900 <= _MSC_VER)) \
|
||||
&& 0)
|
||||
/* [[noreturn]] is not practically usable, because with it the syntax
|
||||
extern _Noreturn void func (...);
|
||||
would not be valid; such a declaration would only be valid with 'extern'
|
||||
and '_Noreturn' swapped, or without the 'extern' keyword. However, some
|
||||
AIX system header files and several gnulib header files use precisely
|
||||
this syntax with 'extern'. */
|
||||
# define _Noreturn [[noreturn]]
|
||||
# elif (defined __clang__ && __clang_major__ < 16 \
|
||||
&& defined _GL_WORK_AROUND_LLVM_BUG_59792)
|
||||
/* Compile with -D_GL_WORK_AROUND_LLVM_BUG_59792 to work around
|
||||
that rare LLVM bug, though you may get many false-alarm warnings. */
|
||||
# define _Noreturn
|
||||
# elif ((!defined __cplusplus || defined __clang__) \
|
||||
&& (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
|
||||
|| (!defined __STRICT_ANSI__ \
|
||||
&& (4 < __GNUC__ + (7 <= __GNUC_MINOR__) \
|
||||
|| (defined __apple_build_version__ \
|
||||
? 6000000 <= __apple_build_version__ \
|
||||
: 3 < __clang_major__ + (5 <= __clang_minor__))))))
|
||||
/* _Noreturn works as-is. */
|
||||
# elif (2 < __GNUC__ + (8 <= __GNUC_MINOR__) || defined __clang__ \
|
||||
|| 0x5110 <= __SUNPRO_C)
|
||||
# define _Noreturn __attribute__ ((__noreturn__))
|
||||
# elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
|
||||
# define _Noreturn __declspec (noreturn)
|
||||
# else
|
||||
# define _Noreturn
|
||||
# endif
|
||||
#endif
|
213
gl/af_alg.c
213
gl/af_alg.c
|
@ -1,213 +0,0 @@
|
|||
/* af_alg.c - Compute message digests from file streams and buffers.
|
||||
Copyright (C) 2018-2023 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Matteo Croce <mcroce@redhat.com>, 2018. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "af_alg.h"
|
||||
|
||||
#if USE_LINUX_CRYPTO_API
|
||||
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <linux/if_alg.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/sendfile.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include "sys-limits.h"
|
||||
|
||||
#define BLOCKSIZE 32768
|
||||
|
||||
/* Return a newly created socket for ALG.
|
||||
On error, return a negative error number. */
|
||||
static int
|
||||
alg_socket (char const *alg)
|
||||
{
|
||||
struct sockaddr_alg salg = {
|
||||
.salg_family = AF_ALG,
|
||||
.salg_type = "hash",
|
||||
};
|
||||
/* Copy alg into salg.salg_name, without calling strcpy nor strlen. */
|
||||
for (size_t i = 0; (salg.salg_name[i] = alg[i]) != '\0'; i++)
|
||||
if (i == sizeof salg.salg_name - 1)
|
||||
/* alg is too long. */
|
||||
return -EINVAL;
|
||||
|
||||
int cfd = socket (AF_ALG, SOCK_SEQPACKET | SOCK_CLOEXEC, 0);
|
||||
if (cfd < 0)
|
||||
return -EAFNOSUPPORT;
|
||||
int ofd = (bind (cfd, (struct sockaddr *) &salg, sizeof salg) == 0
|
||||
? accept4 (cfd, NULL, 0, SOCK_CLOEXEC)
|
||||
: -1);
|
||||
close (cfd);
|
||||
return ofd < 0 ? -EAFNOSUPPORT : ofd;
|
||||
}
|
||||
|
||||
int
|
||||
afalg_buffer (const char *buffer, size_t len, const char *alg,
|
||||
void *resblock, ssize_t hashlen)
|
||||
{
|
||||
/* On Linux < 4.9, the value for an empty stream is wrong (all zeroes).
|
||||
See <https://patchwork.kernel.org/patch/9308641/>.
|
||||
This was not fixed properly until November 2016,
|
||||
see <https://patchwork.kernel.org/patch/9434741/>. */
|
||||
if (len == 0)
|
||||
return -EAFNOSUPPORT;
|
||||
|
||||
int ofd = alg_socket (alg);
|
||||
if (ofd < 0)
|
||||
return ofd;
|
||||
|
||||
int result;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
ssize_t size = (len > BLOCKSIZE ? BLOCKSIZE : len);
|
||||
if (send (ofd, buffer, size, MSG_MORE) != size)
|
||||
{
|
||||
result = -EAFNOSUPPORT;
|
||||
break;
|
||||
}
|
||||
buffer += size;
|
||||
len -= size;
|
||||
if (len == 0)
|
||||
{
|
||||
result = read (ofd, resblock, hashlen) == hashlen ? 0 : -EAFNOSUPPORT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
close (ofd);
|
||||
return result;
|
||||
}
|
||||
|
||||
int
|
||||
afalg_stream (FILE *stream, const char *alg,
|
||||
void *resblock, ssize_t hashlen)
|
||||
{
|
||||
int ofd = alg_socket (alg);
|
||||
if (ofd < 0)
|
||||
return ofd;
|
||||
|
||||
/* If STREAM's size is known and nonzero and not too large, attempt
|
||||
sendfile to pipe the data. The nonzero restriction avoids issues
|
||||
with /proc files that pretend to be empty, and lets the classic
|
||||
read-write loop work around an empty-input bug noted below. */
|
||||
int fd = fileno (stream);
|
||||
int result;
|
||||
struct stat st;
|
||||
off_t off = ftello (stream);
|
||||
if (0 <= off && fstat (fd, &st) == 0
|
||||
&& (S_ISREG (st.st_mode) || S_TYPEISSHM (&st) || S_TYPEISTMO (&st))
|
||||
&& off < st.st_size && st.st_size - off < SYS_BUFSIZE_MAX)
|
||||
{
|
||||
/* Make sure the offset of fileno (stream) reflects how many bytes
|
||||
have been read from stream before this function got invoked.
|
||||
Note: fflush on an input stream after ungetc does not work as expected
|
||||
on some platforms. Therefore this situation is not supported here. */
|
||||
if (fflush (stream))
|
||||
result = -EIO;
|
||||
else
|
||||
{
|
||||
off_t nbytes = st.st_size - off;
|
||||
if (sendfile (ofd, fd, &off, nbytes) == nbytes)
|
||||
{
|
||||
if (read (ofd, resblock, hashlen) == hashlen)
|
||||
{
|
||||
/* The input buffers of stream are no longer valid. */
|
||||
if (lseek (fd, off, SEEK_SET) != (off_t)-1)
|
||||
result = 0;
|
||||
else
|
||||
/* The file position of fd has not changed. */
|
||||
result = -EAFNOSUPPORT;
|
||||
}
|
||||
else
|
||||
/* The file position of fd has not changed. */
|
||||
result = -EAFNOSUPPORT;
|
||||
}
|
||||
else
|
||||
/* The file position of fd has not changed. */
|
||||
result = -EAFNOSUPPORT;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* sendfile not possible, do a classic read-write loop. */
|
||||
|
||||
/* Number of bytes to seek (backwards) in case of error. */
|
||||
off_t nseek = 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
char buf[BLOCKSIZE];
|
||||
/* When the stream is not seekable, start with a single-byte block,
|
||||
so that we can use ungetc() in the case that send() fails. */
|
||||
size_t blocksize = (nseek == 0 && off < 0 ? 1 : BLOCKSIZE);
|
||||
ssize_t size = fread (buf, 1, blocksize, stream);
|
||||
if (size == 0)
|
||||
{
|
||||
/* On Linux < 4.9, the value for an empty stream is wrong (all 0).
|
||||
See <https://patchwork.kernel.org/patch/9308641/>.
|
||||
This was not fixed properly until November 2016,
|
||||
see <https://patchwork.kernel.org/patch/9434741/>. */
|
||||
result = ferror (stream) ? -EIO : nseek == 0 ? -EAFNOSUPPORT : 0;
|
||||
break;
|
||||
}
|
||||
nseek -= size;
|
||||
if (send (ofd, buf, size, MSG_MORE) != size)
|
||||
{
|
||||
if (nseek == -1)
|
||||
{
|
||||
/* 1 byte of pushback buffer is guaranteed on stream, even
|
||||
if stream is not seekable. */
|
||||
ungetc ((unsigned char) buf[0], stream);
|
||||
result = -EAFNOSUPPORT;
|
||||
}
|
||||
else if (fseeko (stream, nseek, SEEK_CUR) == 0)
|
||||
/* The position of stream has been restored. */
|
||||
result = -EAFNOSUPPORT;
|
||||
else
|
||||
result = -EIO;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Don't assume that EOF is sticky. See:
|
||||
<https://sourceware.org/bugzilla/show_bug.cgi?id=19476>. */
|
||||
if (feof (stream))
|
||||
{
|
||||
result = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (result == 0 && read (ofd, resblock, hashlen) != hashlen)
|
||||
{
|
||||
if (nseek == 0 || fseeko (stream, nseek, SEEK_CUR) == 0)
|
||||
/* The position of stream has been restored. */
|
||||
result = -EAFNOSUPPORT;
|
||||
else
|
||||
result = -EIO;
|
||||
}
|
||||
}
|
||||
close (ofd);
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif
|
115
gl/af_alg.h
115
gl/af_alg.h
|
@ -1,115 +0,0 @@
|
|||
/* af_alg.h - Compute message digests from file streams and buffers.
|
||||
Copyright (C) 2018-2023 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Matteo Croce <mcroce@redhat.com>, 2018.
|
||||
Documentation by Bruno Haible <bruno@clisp.org>, 2018. */
|
||||
|
||||
/* Declare specific functions for computing message digests
|
||||
using the Linux kernel crypto API, if available. This kernel API gives
|
||||
access to specialized crypto instructions (that would also be available
|
||||
in user space) or to crypto devices (not directly available in user space).
|
||||
|
||||
For a more complete set of facilities that use the Linux kernel crypto API,
|
||||
look at libkcapi. */
|
||||
|
||||
#ifndef AF_ALG_H
|
||||
# define AF_ALG_H 1
|
||||
|
||||
# include <stdio.h>
|
||||
# include <errno.h>
|
||||
|
||||
# ifdef __cplusplus
|
||||
extern "C" {
|
||||
# endif
|
||||
|
||||
# if USE_LINUX_CRYPTO_API
|
||||
|
||||
/* Compute a message digest of a memory region.
|
||||
|
||||
The memory region starts at BUFFER and is LEN bytes long.
|
||||
|
||||
ALG is the message digest algorithm; see the file /proc/crypto.
|
||||
|
||||
RESBLOCK points to a block of HASHLEN bytes, for the result.
|
||||
HASHLEN must be the length of the message digest, in bytes, in particular:
|
||||
|
||||
alg | hashlen
|
||||
-------+--------
|
||||
md5 | 16
|
||||
sha1 | 20
|
||||
sha224 | 28
|
||||
sha256 | 32
|
||||
sha384 | 48
|
||||
sha512 | 64
|
||||
|
||||
If successful, fill RESBLOCK and return 0.
|
||||
Upon failure, return a negated error number. */
|
||||
int
|
||||
afalg_buffer (const char *buffer, size_t len, const char *alg,
|
||||
void *resblock, ssize_t hashlen);
|
||||
|
||||
/* Compute a message digest of data read from STREAM.
|
||||
|
||||
STREAM is an open file stream. The last operation on STREAM should
|
||||
not be 'ungetc', and if STREAM is also open for writing it should
|
||||
have been fflushed since its last write. Read from the current
|
||||
position to the end of STREAM. Handle regular files efficiently.
|
||||
|
||||
ALG is the message digest algorithm; see the file /proc/crypto.
|
||||
|
||||
RESBLOCK points to a block of HASHLEN bytes, for the result.
|
||||
HASHLEN must be the length of the message digest, in bytes, in particular:
|
||||
|
||||
alg | hashlen
|
||||
-------+--------
|
||||
md5 | 16
|
||||
sha1 | 20
|
||||
sha224 | 28
|
||||
sha256 | 32
|
||||
sha384 | 48
|
||||
sha512 | 64
|
||||
|
||||
If successful, fill RESBLOCK and return 0.
|
||||
Upon failure, return a negated error number.
|
||||
Unless returning 0 or -EIO, restore STREAM's file position so that
|
||||
the caller can fall back on some other method. */
|
||||
int
|
||||
afalg_stream (FILE *stream, const char *alg,
|
||||
void *resblock, ssize_t hashlen);
|
||||
|
||||
# else
|
||||
|
||||
static inline int
|
||||
afalg_buffer (const char *buffer, size_t len, const char *alg,
|
||||
void *resblock, ssize_t hashlen)
|
||||
{
|
||||
return -EAFNOSUPPORT;
|
||||
}
|
||||
|
||||
static inline int
|
||||
afalg_stream (FILE *stream, const char *alg,
|
||||
void *resblock, ssize_t hashlen)
|
||||
{
|
||||
return -EAFNOSUPPORT;
|
||||
}
|
||||
|
||||
# endif
|
||||
|
||||
# ifdef __cplusplus
|
||||
}
|
||||
# endif
|
||||
|
||||
#endif /* AF_ALG_H */
|
|
@ -1,20 +1,22 @@
|
|||
/* Memory allocation on the stack.
|
||||
|
||||
Copyright (C) 1995, 1999, 2001-2004, 2006-2023 Free Software Foundation,
|
||||
Copyright (C) 1995, 1999, 2001-2004, 2006-2013 Free Software Foundation,
|
||||
Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
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 Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with this program; if not, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H
|
||||
means there is a real alloca function. */
|
||||
|
@ -33,16 +35,7 @@
|
|||
*/
|
||||
|
||||
#ifndef alloca
|
||||
/* Some version of mingw have an <alloca.h> that causes trouble when
|
||||
included after 'alloca' gets defined as a macro. As a workaround,
|
||||
include this <alloca.h> first and define 'alloca' as a macro afterwards
|
||||
if needed. */
|
||||
# if defined __GNUC__ && (defined _WIN32 && ! defined __CYGWIN__) && @HAVE_ALLOCA_H@
|
||||
# include_next <alloca.h>
|
||||
# endif
|
||||
#endif
|
||||
#ifndef alloca
|
||||
# if defined __GNUC__ || (__clang_major__ >= 4)
|
||||
# ifdef __GNUC__
|
||||
# define alloca __builtin_alloca
|
||||
# elif defined _AIX
|
||||
# define alloca __alloca
|
||||
|
@ -58,8 +51,6 @@ extern "C"
|
|||
void *_alloca (unsigned short);
|
||||
# pragma intrinsic (_alloca)
|
||||
# define alloca _alloca
|
||||
# elif defined __MVS__
|
||||
# include <stdlib.h>
|
||||
# else
|
||||
# include <stddef.h>
|
||||
# ifdef __cplusplus
|
||||
|
|
|
@ -1,19 +1,19 @@
|
|||
/* A GNU-like <arpa/inet.h>.
|
||||
|
||||
Copyright (C) 2005-2006, 2008-2023 Free Software Foundation, Inc.
|
||||
Copyright (C) 2005-2006, 2008-2013 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _@GUARD_PREFIX@_ARPA_INET_H
|
||||
|
||||
|
@ -49,12 +49,6 @@
|
|||
#ifndef _@GUARD_PREFIX@_ARPA_INET_H
|
||||
#define _@GUARD_PREFIX@_ARPA_INET_H
|
||||
|
||||
/* Get all possible declarations of inet_ntop() and inet_pton(). */
|
||||
#if (@GNULIB_INET_NTOP@ || @GNULIB_INET_PTON@ || defined GNULIB_POSIXCHECK) \
|
||||
&& @HAVE_WS2TCPIP_H@
|
||||
# include <ws2tcpip.h>
|
||||
#endif
|
||||
|
||||
/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
|
||||
|
||||
/* The definition of _GL_ARG_NONNULL is copied here. */
|
||||
|
@ -76,8 +70,8 @@
|
|||
the return value is NULL and errno is set to ENOSPC. A good value
|
||||
for CNT is 46.
|
||||
|
||||
For more details, see the POSIX:2008 specification
|
||||
<https://pubs.opengroup.org/onlinepubs/9699919799/functions/inet_ntop.html>. */
|
||||
For more details, see the POSIX:2001 specification
|
||||
<http://www.opengroup.org/susv3xsh/inet_ntop.html>. */
|
||||
# if @REPLACE_INET_NTOP@
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# undef inet_ntop
|
||||
|
@ -103,9 +97,7 @@ _GL_CXXALIAS_SYS_CAST (inet_ntop, const char *,
|
|||
(int af, const void *restrict src,
|
||||
char *restrict dst, socklen_t cnt));
|
||||
# endif
|
||||
# if __GLIBC__ >= 2
|
||||
_GL_CXXALIASWARN (inet_ntop);
|
||||
# endif
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef inet_ntop
|
||||
# if HAVE_RAW_DECL_INET_NTOP
|
||||
|
@ -134,9 +126,7 @@ _GL_FUNCDECL_SYS (inet_pton, int,
|
|||
_GL_CXXALIAS_SYS (inet_pton, int,
|
||||
(int af, const char *restrict src, void *restrict dst));
|
||||
# endif
|
||||
# if __GLIBC__ >= 2
|
||||
_GL_CXXALIASWARN (inet_pton);
|
||||
# endif
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef inet_pton
|
||||
# if HAVE_RAW_DECL_INET_PTON
|
||||
|
|
|
@ -1,18 +1,18 @@
|
|||
/* Formatted output to strings.
|
||||
Copyright (C) 1999, 2002, 2006, 2009-2023 Free Software Foundation, Inc.
|
||||
Copyright (C) 1999, 2002, 2006, 2009-2013 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
|
|
@ -1,19 +1,19 @@
|
|||
/* Formatted output to strings.
|
||||
Copyright (C) 1999, 2002, 2006-2007, 2009-2023 Free Software Foundation,
|
||||
Copyright (C) 1999, 2002, 2006-2007, 2009-2013 Free Software Foundation,
|
||||
Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
|
|
@ -1,27 +0,0 @@
|
|||
/* Substitute for and wrapper around <assert.h>
|
||||
Copyright (C) 2011-2023 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Do not guard the include, since <assert.h> is supposed to define
|
||||
the assert macro each time it is included. */
|
||||
|
||||
#if __GNUC__ >= 3
|
||||
@PRAGMA_SYSTEM_HEADER@
|
||||
#endif
|
||||
@PRAGMA_COLUMNS@
|
||||
|
||||
#@INCLUDE_NEXT@ @NEXT_ASSERT_H@
|
||||
|
||||
/* The definition of static_assert is copied here. */
|
226
gl/attribute.h
226
gl/attribute.h
|
@ -1,226 +0,0 @@
|
|||
/* ATTRIBUTE_* macros for using attributes in GCC and similar compilers
|
||||
|
||||
Copyright 2020-2023 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Paul Eggert. */
|
||||
|
||||
/* Provide public ATTRIBUTE_* names for the private _GL_ATTRIBUTE_*
|
||||
macros used within Gnulib. */
|
||||
|
||||
/* These attributes can be placed in two ways:
|
||||
- At the start of a declaration (i.e. even before storage-class
|
||||
specifiers!); then they apply to all entities that are declared
|
||||
by the declaration.
|
||||
- Immediately after the name of an entity being declared by the
|
||||
declaration; then they apply to that entity only. */
|
||||
|
||||
#ifndef _GL_ATTRIBUTE_H
|
||||
#define _GL_ATTRIBUTE_H
|
||||
|
||||
|
||||
/* This file defines two types of attributes:
|
||||
* C23 standard attributes. These have macro names that do not begin with
|
||||
'ATTRIBUTE_'.
|
||||
* Selected GCC attributes; see:
|
||||
https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html
|
||||
https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html
|
||||
https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html
|
||||
These names begin with 'ATTRIBUTE_' to avoid name clashes. */
|
||||
|
||||
|
||||
/* =============== Attributes for specific kinds of functions =============== */
|
||||
|
||||
/* Attributes for functions that should not be used. */
|
||||
|
||||
/* Warn if the entity is used. */
|
||||
/* Applies to:
|
||||
- function, variable,
|
||||
- struct, union, struct/union member,
|
||||
- enumeration, enumeration item,
|
||||
- typedef,
|
||||
in C++ also: namespace, class, template specialization. */
|
||||
#define DEPRECATED _GL_ATTRIBUTE_DEPRECATED
|
||||
|
||||
/* If a function call is not optimized way, warn with MSG. */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_WARNING(msg) _GL_ATTRIBUTE_WARNING (msg)
|
||||
|
||||
/* If a function call is not optimized way, report an error with MSG. */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_ERROR(msg) _GL_ATTRIBUTE_ERROR (msg)
|
||||
|
||||
|
||||
/* Attributes for memory-allocating functions. */
|
||||
|
||||
/* The function returns a pointer to freshly allocated memory. */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_MALLOC _GL_ATTRIBUTE_MALLOC
|
||||
|
||||
/* ATTRIBUTE_ALLOC_SIZE ((N)) - The Nth argument of the function
|
||||
is the size of the returned memory block.
|
||||
ATTRIBUTE_ALLOC_SIZE ((M, N)) - Multiply the Mth and Nth arguments
|
||||
to determine the size of the returned memory block. */
|
||||
/* Applies to: function, pointer to function, function types. */
|
||||
#define ATTRIBUTE_ALLOC_SIZE(args) _GL_ATTRIBUTE_ALLOC_SIZE (args)
|
||||
|
||||
/* ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
|
||||
that can be freed by passing them as the Ith argument to the
|
||||
function F.
|
||||
ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that
|
||||
can be freed via 'free'; it can be used only after declaring 'free'. */
|
||||
/* Applies to: functions. Cannot be used on inline functions. */
|
||||
#define ATTRIBUTE_DEALLOC(f, i) _GL_ATTRIBUTE_DEALLOC(f, i)
|
||||
#define ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC_FREE
|
||||
|
||||
/* Attributes for variadic functions. */
|
||||
|
||||
/* The variadic function expects a trailing NULL argument.
|
||||
ATTRIBUTE_SENTINEL () - The last argument is NULL (requires C99).
|
||||
ATTRIBUTE_SENTINEL ((N)) - The (N+1)st argument from the end is NULL. */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_SENTINEL(pos) _GL_ATTRIBUTE_SENTINEL (pos)
|
||||
|
||||
|
||||
/* ================== Attributes for compiler diagnostics ================== */
|
||||
|
||||
/* Attributes that help the compiler diagnose programmer mistakes.
|
||||
Some of them may also help for some compiler optimizations. */
|
||||
|
||||
/* ATTRIBUTE_FORMAT ((ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK)) -
|
||||
The STRING-INDEXth function argument is a format string of style
|
||||
ARCHETYPE, which is one of:
|
||||
printf, gnu_printf
|
||||
scanf, gnu_scanf,
|
||||
strftime, gnu_strftime,
|
||||
strfmon,
|
||||
or the same thing prefixed and suffixed with '__'.
|
||||
If FIRST-TO-CHECK is not 0, arguments starting at FIRST-TO_CHECK
|
||||
are suitable for the format string. */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_FORMAT(spec) _GL_ATTRIBUTE_FORMAT (spec)
|
||||
|
||||
/* ATTRIBUTE_NONNULL ((N1, N2,...)) - Arguments N1, N2,... must not be NULL.
|
||||
ATTRIBUTE_NONNULL () - All pointer arguments must not be null. */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_NONNULL(args) _GL_ATTRIBUTE_NONNULL (args)
|
||||
|
||||
/* The function's return value is a non-NULL pointer. */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_RETURNS_NONNULL _GL_ATTRIBUTE_RETURNS_NONNULL
|
||||
|
||||
/* Warn if the caller does not use the return value,
|
||||
unless the caller uses something like ignore_value. */
|
||||
/* Applies to: function, enumeration, class. */
|
||||
#define NODISCARD _GL_ATTRIBUTE_NODISCARD
|
||||
|
||||
|
||||
/* Attributes that disable false alarms when the compiler diagnoses
|
||||
programmer "mistakes". */
|
||||
|
||||
/* Do not warn if the entity is not used. */
|
||||
/* Applies to:
|
||||
- function, variable,
|
||||
- struct, union, struct/union member,
|
||||
- enumeration, enumeration item,
|
||||
- typedef,
|
||||
in C++ also: class. */
|
||||
#define MAYBE_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED
|
||||
|
||||
/* The contents of a character array is not meant to be NUL-terminated. */
|
||||
/* Applies to: struct/union members and variables that are arrays of element
|
||||
type '[[un]signed] char'. */
|
||||
#define ATTRIBUTE_NONSTRING _GL_ATTRIBUTE_NONSTRING
|
||||
|
||||
/* Do not warn if control flow falls through to the immediately
|
||||
following 'case' or 'default' label. */
|
||||
/* Applies to: Empty statement (;), inside a 'switch' statement. */
|
||||
#define FALLTHROUGH _GL_ATTRIBUTE_FALLTHROUGH
|
||||
|
||||
|
||||
/* ================== Attributes for debugging information ================== */
|
||||
|
||||
/* Attributes regarding debugging information emitted by the compiler. */
|
||||
|
||||
/* Omit the function from stack traces when debugging. */
|
||||
/* Applies to: function. */
|
||||
#define ATTRIBUTE_ARTIFICIAL _GL_ATTRIBUTE_ARTIFICIAL
|
||||
|
||||
/* Make the entity visible to debuggers etc., even with '-fwhole-program'. */
|
||||
/* Applies to: functions, variables. */
|
||||
#define ATTRIBUTE_EXTERNALLY_VISIBLE _GL_ATTRIBUTE_EXTERNALLY_VISIBLE
|
||||
|
||||
|
||||
/* ========== Attributes that mainly direct compiler optimizations ========== */
|
||||
|
||||
/* The function does not throw exceptions. */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_NOTHROW _GL_ATTRIBUTE_NOTHROW
|
||||
|
||||
/* Do not inline the function. */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_NOINLINE _GL_ATTRIBUTE_NOINLINE
|
||||
|
||||
/* Always inline the function, and report an error if the compiler
|
||||
cannot inline. */
|
||||
/* Applies to: function. */
|
||||
#define ATTRIBUTE_ALWAYS_INLINE _GL_ATTRIBUTE_ALWAYS_INLINE
|
||||
|
||||
/* It is OK for a compiler to omit duplicate calls with the same arguments.
|
||||
This attribute is safe for a function that neither depends on
|
||||
nor affects observable state, and always returns exactly once -
|
||||
e.g., does not loop forever, and does not call longjmp.
|
||||
(This attribute is stricter than ATTRIBUTE_PURE.) */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_CONST _GL_ATTRIBUTE_CONST
|
||||
|
||||
/* It is OK for a compiler to omit duplicate calls with the same
|
||||
arguments if observable state is not changed between calls.
|
||||
This attribute is safe for a function that does not affect
|
||||
observable state, and always returns exactly once.
|
||||
(This attribute is looser than ATTRIBUTE_CONST.) */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_PURE _GL_ATTRIBUTE_PURE
|
||||
|
||||
/* The function is rarely executed. */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_COLD _GL_ATTRIBUTE_COLD
|
||||
|
||||
/* If called from some other compilation unit, the function executes
|
||||
code from that unit only by return or by exception handling,
|
||||
letting the compiler optimize that unit more aggressively. */
|
||||
/* Applies to: functions. */
|
||||
#define ATTRIBUTE_LEAF _GL_ATTRIBUTE_LEAF
|
||||
|
||||
/* For struct members: The member has the smallest possible alignment.
|
||||
For struct, union, class: All members have the smallest possible alignment,
|
||||
minimizing the memory required. */
|
||||
/* Applies to: struct members, struct, union,
|
||||
in C++ also: class. */
|
||||
#define ATTRIBUTE_PACKED _GL_ATTRIBUTE_PACKED
|
||||
|
||||
|
||||
/* ================ Attributes that make invalid code valid ================ */
|
||||
|
||||
/* Attributes that prevent fatal compiler optimizations for code that is not
|
||||
fully ISO C compliant. */
|
||||
|
||||
/* Pointers to the type may point to the same storage as pointers to
|
||||
other types, thus disabling strict aliasing optimization. */
|
||||
/* Applies to: types. */
|
||||
#define ATTRIBUTE_MAY_ALIAS _GL_ATTRIBUTE_MAY_ALIAS
|
||||
|
||||
|
||||
#endif /* _GL_ATTRIBUTE_H */
|
126
gl/base64.c
126
gl/base64.c
|
@ -1,24 +1,24 @@
|
|||
/* base64.c -- Encode binary data using printable characters.
|
||||
Copyright (C) 1999-2001, 2004-2006, 2009-2023 Free Software Foundation, Inc.
|
||||
Copyright (C) 1999-2001, 2004-2006, 2009-2013 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Simon Josefsson. Partially adapted from GNU MailUtils
|
||||
* (mailbox/filter_trans.c, as of 2004-11-28). Improved by review
|
||||
* from Paul Eggert, Bruno Haible, and Stepan Kasal.
|
||||
*
|
||||
* See also RFC 4648 <https://www.ietf.org/rfc/rfc4648.txt>.
|
||||
* See also RFC 4648 <http://www.ietf.org/rfc/rfc4648.txt>.
|
||||
*
|
||||
* Be careful with error checking. Here is how you would typically
|
||||
* use these functions:
|
||||
|
@ -30,7 +30,7 @@
|
|||
* FAIL: memory allocation error
|
||||
* OK: data in OUT/OUTLEN
|
||||
*
|
||||
* idx_t outlen = base64_encode_alloc (in, inlen, &out);
|
||||
* size_t outlen = base64_encode_alloc (in, inlen, &out);
|
||||
* if (out == NULL && outlen == 0 && inlen != 0)
|
||||
* FAIL: input too long
|
||||
* if (out == NULL)
|
||||
|
@ -44,84 +44,51 @@
|
|||
/* Get prototype. */
|
||||
#include "base64.h"
|
||||
|
||||
/* Get imalloc. */
|
||||
#include <ialloc.h>
|
||||
|
||||
#include <intprops.h>
|
||||
/* Get malloc. */
|
||||
#include <stdlib.h>
|
||||
|
||||
/* Get UCHAR_MAX. */
|
||||
#include <limits.h>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
/* Convert 'char' to 'unsigned char' without casting. */
|
||||
/* C89 compliant way to cast 'char' to 'unsigned char'. */
|
||||
static unsigned char
|
||||
to_uchar (char ch)
|
||||
{
|
||||
return ch;
|
||||
}
|
||||
|
||||
static const char b64c[64] =
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
|
||||
/* Base64 encode IN array of size INLEN into OUT array. OUT needs
|
||||
to be of length >= BASE64_LENGTH(INLEN), and INLEN needs to be
|
||||
a multiple of 3. */
|
||||
static void
|
||||
base64_encode_fast (const char *restrict in, idx_t inlen, char *restrict out)
|
||||
{
|
||||
while (inlen)
|
||||
{
|
||||
*out++ = b64c[(to_uchar (in[0]) >> 2) & 0x3f];
|
||||
*out++ = b64c[((to_uchar (in[0]) << 4) + (to_uchar (in[1]) >> 4)) & 0x3f];
|
||||
*out++ = b64c[((to_uchar (in[1]) << 2) + (to_uchar (in[2]) >> 6)) & 0x3f];
|
||||
*out++ = b64c[to_uchar (in[2]) & 0x3f];
|
||||
|
||||
inlen -= 3;
|
||||
in += 3;
|
||||
}
|
||||
}
|
||||
|
||||
/* Base64 encode IN array of size INLEN into OUT array of size OUTLEN.
|
||||
If OUTLEN is less than BASE64_LENGTH(INLEN), write as many bytes as
|
||||
possible. If OUTLEN is larger than BASE64_LENGTH(INLEN), also zero
|
||||
terminate the output buffer. */
|
||||
void
|
||||
base64_encode (const char *restrict in, idx_t inlen,
|
||||
char *restrict out, idx_t outlen)
|
||||
base64_encode (const char *restrict in, size_t inlen,
|
||||
char *restrict out, size_t outlen)
|
||||
{
|
||||
/* Note this outlen constraint can be enforced at compile time.
|
||||
I.E. that the output buffer is exactly large enough to hold
|
||||
the encoded inlen bytes. The inlen constraints (of corresponding
|
||||
to outlen, and being a multiple of 3) can change at runtime
|
||||
at the end of input. However the common case when reading
|
||||
large inputs is to have both constraints satisfied, so we depend
|
||||
on both in base_encode_fast(). */
|
||||
if (outlen % 4 == 0 && inlen == (outlen >> 2) * 3)
|
||||
{
|
||||
base64_encode_fast (in, inlen, out);
|
||||
return;
|
||||
}
|
||||
static const char b64str[64] =
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
|
||||
while (inlen && outlen)
|
||||
{
|
||||
*out++ = b64c[(to_uchar (in[0]) >> 2) & 0x3f];
|
||||
*out++ = b64str[(to_uchar (in[0]) >> 2) & 0x3f];
|
||||
if (!--outlen)
|
||||
break;
|
||||
*out++ = b64c[((to_uchar (in[0]) << 4)
|
||||
*out++ = b64str[((to_uchar (in[0]) << 4)
|
||||
+ (--inlen ? to_uchar (in[1]) >> 4 : 0))
|
||||
& 0x3f];
|
||||
if (!--outlen)
|
||||
break;
|
||||
*out++ =
|
||||
(inlen
|
||||
? b64c[((to_uchar (in[1]) << 2)
|
||||
? b64str[((to_uchar (in[1]) << 2)
|
||||
+ (--inlen ? to_uchar (in[2]) >> 6 : 0))
|
||||
& 0x3f]
|
||||
: '=');
|
||||
if (!--outlen)
|
||||
break;
|
||||
*out++ = inlen ? b64c[to_uchar (in[2]) & 0x3f] : '=';
|
||||
*out++ = inlen ? b64str[to_uchar (in[2]) & 0x3f] : '=';
|
||||
if (!--outlen)
|
||||
break;
|
||||
if (inlen)
|
||||
|
@ -143,21 +110,30 @@ base64_encode (const char *restrict in, idx_t inlen,
|
|||
memory allocation failed, OUT is set to NULL, and the return value
|
||||
indicates length of the requested memory block, i.e.,
|
||||
BASE64_LENGTH(inlen) + 1. */
|
||||
idx_t
|
||||
base64_encode_alloc (const char *in, idx_t inlen, char **out)
|
||||
size_t
|
||||
base64_encode_alloc (const char *in, size_t inlen, char **out)
|
||||
{
|
||||
size_t outlen = 1 + BASE64_LENGTH (inlen);
|
||||
|
||||
/* Check for overflow in outlen computation.
|
||||
Treat negative INLEN as overflow, for better compatibility with
|
||||
pre-2021-08-27 API, which used size_t. */
|
||||
idx_t in_over_3 = inlen / 3 + (inlen % 3 != 0), outlen;
|
||||
if (! INT_MULTIPLY_OK (in_over_3, 4, &outlen) || inlen < 0)
|
||||
*
|
||||
* If there is no overflow, outlen >= inlen.
|
||||
*
|
||||
* If the operation (inlen + 2) overflows then it yields at most +1, so
|
||||
* outlen is 0.
|
||||
*
|
||||
* If the multiplication overflows, we lose at least half of the
|
||||
* correct value, so the result is < ((inlen + 2) / 3) * 2, which is
|
||||
* less than (inlen + 2) * 0.66667, which is less than inlen as soon as
|
||||
* (inlen > 4).
|
||||
*/
|
||||
if (inlen > outlen)
|
||||
{
|
||||
*out = NULL;
|
||||
return 0;
|
||||
}
|
||||
outlen++;
|
||||
|
||||
*out = imalloc (outlen);
|
||||
*out = malloc (outlen);
|
||||
if (!*out)
|
||||
return outlen;
|
||||
|
||||
|
@ -341,7 +317,7 @@ base64_decode_ctx_init (struct base64_decode_context *ctx)
|
|||
static char *
|
||||
get_4 (struct base64_decode_context *ctx,
|
||||
char const *restrict *in, char const *restrict in_end,
|
||||
idx_t *n_non_newline)
|
||||
size_t *n_non_newline)
|
||||
{
|
||||
if (ctx->i == 4)
|
||||
ctx->i = 0;
|
||||
|
@ -393,8 +369,8 @@ get_4 (struct base64_decode_context *ctx,
|
|||
*OUT to point to the byte after the last one written, and decrement
|
||||
*OUTLEN to reflect the number of bytes remaining in *OUT. */
|
||||
static bool
|
||||
decode_4 (char const *restrict in, idx_t inlen,
|
||||
char *restrict *outp, idx_t *outleft)
|
||||
decode_4 (char const *restrict in, size_t inlen,
|
||||
char *restrict *outp, size_t *outleft)
|
||||
{
|
||||
char *out = *outp;
|
||||
if (inlen < 2)
|
||||
|
@ -479,10 +455,10 @@ decode_4 (char const *restrict in, idx_t inlen,
|
|||
|
||||
bool
|
||||
base64_decode_ctx (struct base64_decode_context *ctx,
|
||||
const char *restrict in, idx_t inlen,
|
||||
char *restrict out, idx_t *outlen)
|
||||
const char *restrict in, size_t inlen,
|
||||
char *restrict out, size_t *outlen)
|
||||
{
|
||||
idx_t outleft = *outlen;
|
||||
size_t outleft = *outlen;
|
||||
bool ignore_newlines = ctx != NULL;
|
||||
bool flush_ctx = false;
|
||||
unsigned int ctx_i = 0;
|
||||
|
@ -496,7 +472,7 @@ base64_decode_ctx (struct base64_decode_context *ctx,
|
|||
|
||||
while (true)
|
||||
{
|
||||
idx_t outleft_save = outleft;
|
||||
size_t outleft_save = outleft;
|
||||
if (ctx_i == 0 && !flush_ctx)
|
||||
{
|
||||
while (true)
|
||||
|
@ -570,17 +546,17 @@ base64_decode_ctx (struct base64_decode_context *ctx,
|
|||
undefined. */
|
||||
bool
|
||||
base64_decode_alloc_ctx (struct base64_decode_context *ctx,
|
||||
const char *in, idx_t inlen, char **out,
|
||||
idx_t *outlen)
|
||||
const char *in, size_t inlen, char **out,
|
||||
size_t *outlen)
|
||||
{
|
||||
/* This may allocate a few bytes too many, depending on input,
|
||||
but it's not worth the extra CPU time to compute the exact size.
|
||||
The exact size is 3 * (inlen + (ctx ? ctx->i : 0)) / 4, minus 1 if the
|
||||
input ends with "=" and minus another 1 if the input ends with "==".
|
||||
Shifting before multiplying avoids the possibility of overflow. */
|
||||
idx_t needlen = 3 * ((inlen >> 2) + 1);
|
||||
Dividing before multiplying avoids the possibility of overflow. */
|
||||
size_t needlen = 3 * (inlen / 4) + 3;
|
||||
|
||||
*out = imalloc (needlen);
|
||||
*out = malloc (needlen);
|
||||
if (!*out)
|
||||
return true;
|
||||
|
||||
|
|
41
gl/base64.h
41
gl/base64.h
|
@ -1,25 +1,28 @@
|
|||
/* base64.h -- Encode binary data using printable characters.
|
||||
Copyright (C) 2004-2006, 2009-2023 Free Software Foundation, Inc.
|
||||
Copyright (C) 2004-2006, 2009-2013 Free Software Foundation, Inc.
|
||||
Written by Simon Josefsson.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef BASE64_H
|
||||
# define BASE64_H
|
||||
|
||||
/* Get idx_t. */
|
||||
# include <idx.h>
|
||||
/* Get size_t. */
|
||||
# include <stddef.h>
|
||||
|
||||
/* Get bool. */
|
||||
# include <stdbool.h>
|
||||
|
||||
# ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
@ -31,26 +34,26 @@ extern "C" {
|
|||
|
||||
struct base64_decode_context
|
||||
{
|
||||
int i;
|
||||
unsigned int i;
|
||||
char buf[4];
|
||||
};
|
||||
|
||||
extern bool isbase64 (char ch) _GL_ATTRIBUTE_CONST;
|
||||
|
||||
extern void base64_encode (const char *restrict in, idx_t inlen,
|
||||
char *restrict out, idx_t outlen);
|
||||
extern void base64_encode (const char *restrict in, size_t inlen,
|
||||
char *restrict out, size_t outlen);
|
||||
|
||||
extern idx_t base64_encode_alloc (const char *in, idx_t inlen, char **out);
|
||||
extern size_t base64_encode_alloc (const char *in, size_t inlen, char **out);
|
||||
|
||||
extern void base64_decode_ctx_init (struct base64_decode_context *ctx);
|
||||
|
||||
extern bool base64_decode_ctx (struct base64_decode_context *ctx,
|
||||
const char *restrict in, idx_t inlen,
|
||||
char *restrict out, idx_t *outlen);
|
||||
const char *restrict in, size_t inlen,
|
||||
char *restrict out, size_t *outlen);
|
||||
|
||||
extern bool base64_decode_alloc_ctx (struct base64_decode_context *ctx,
|
||||
const char *in, idx_t inlen,
|
||||
char **out, idx_t *outlen);
|
||||
const char *in, size_t inlen,
|
||||
char **out, size_t *outlen);
|
||||
|
||||
#define base64_decode(in, inlen, out, outlen) \
|
||||
base64_decode_ctx (NULL, in, inlen, out, outlen)
|
||||
|
|
|
@ -1,36 +1,37 @@
|
|||
/* basename.c -- return the last element in a file name
|
||||
|
||||
Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2023 Free Software
|
||||
Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2013 Free Software
|
||||
Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include "basename-lgpl.h"
|
||||
#include "dirname.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "filename.h"
|
||||
/* Return the address of the last file name component of NAME. If
|
||||
NAME has no relative file name components because it is a file
|
||||
system root, return the empty string. */
|
||||
|
||||
char *
|
||||
last_component (char const *name)
|
||||
{
|
||||
char const *base = name + FILE_SYSTEM_PREFIX_LEN (name);
|
||||
char const *p;
|
||||
bool last_was_slash = false;
|
||||
bool saw_slash = false;
|
||||
|
||||
while (ISSLASH (*base))
|
||||
base++;
|
||||
|
@ -38,17 +39,21 @@ last_component (char const *name)
|
|||
for (p = base; *p; p++)
|
||||
{
|
||||
if (ISSLASH (*p))
|
||||
last_was_slash = true;
|
||||
else if (last_was_slash)
|
||||
saw_slash = true;
|
||||
else if (saw_slash)
|
||||
{
|
||||
base = p;
|
||||
last_was_slash = false;
|
||||
saw_slash = false;
|
||||
}
|
||||
}
|
||||
|
||||
return (char *) base;
|
||||
}
|
||||
|
||||
/* Return the length of the basename NAME. Typically NAME is the
|
||||
value returned by base_name or last_component. Act like strlen
|
||||
(NAME), except omit all trailing slashes. */
|
||||
|
||||
size_t
|
||||
base_len (char const *name)
|
||||
{
|
||||
|
|
|
@ -1,78 +0,0 @@
|
|||
/* Extract the last component (base name) of a file name.
|
||||
|
||||
Copyright (C) 1998, 2001, 2003-2006, 2009-2023 Free Software Foundation,
|
||||
Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _BASENAME_LGPL_H
|
||||
#define _BASENAME_LGPL_H
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
|
||||
# define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/* Return the address of the last file name component of FILENAME.
|
||||
If FILENAME has some trailing slash(es), they are considered to be
|
||||
part of the last component.
|
||||
If FILENAME has no relative file name components because it is a file
|
||||
system root, return the empty string.
|
||||
Examples:
|
||||
FILENAME RESULT
|
||||
"foo.c" "foo.c"
|
||||
"foo/bar.c" "bar.c"
|
||||
"/foo/bar.c" "bar.c"
|
||||
"foo/bar/" "bar/"
|
||||
"foo/bar//" "bar//"
|
||||
"/" ""
|
||||
"//" ""
|
||||
"" ""
|
||||
The return value is a tail of the given FILENAME; do NOT free() it! */
|
||||
|
||||
/* This function was traditionally called 'basename', but we avoid this
|
||||
function name because
|
||||
* Various platforms have different functions in their libc.
|
||||
In particular, the glibc basename(), defined in <string.h>, does
|
||||
not consider trailing slashes to be part of the component:
|
||||
FILENAME RESULT
|
||||
"foo/bar/" ""
|
||||
"foo/bar//" ""
|
||||
* The 'basename' command eliminates trailing slashes and for a root
|
||||
produces a non-empty result:
|
||||
FILENAME RESULT
|
||||
"foo/bar/" "bar"
|
||||
"foo/bar//" "bar"
|
||||
"/" "/"
|
||||
"//" "/"
|
||||
*/
|
||||
extern char *last_component (char const *filename) _GL_ATTRIBUTE_PURE;
|
||||
|
||||
/* Return the length of the basename FILENAME.
|
||||
Typically FILENAME is the value returned by base_name or last_component.
|
||||
Act like strlen (FILENAME), except omit all trailing slashes. */
|
||||
extern size_t base_len (char const *filename) _GL_ATTRIBUTE_PURE;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* _BASENAME_LGPL_H */
|
|
@ -1,11 +1,11 @@
|
|||
/* basename.c -- return the last element in a file name
|
||||
|
||||
Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2023 Free Software
|
||||
Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2013 Free Software
|
||||
Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
|
@ -14,7 +14,7 @@
|
|||
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 <https://www.gnu.org/licenses/>. */
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
@ -22,43 +22,37 @@
|
|||
|
||||
#include <string.h>
|
||||
#include "xalloc.h"
|
||||
#include "xstrndup.h"
|
||||
|
||||
char *
|
||||
base_name (char const *name)
|
||||
{
|
||||
char const *base = last_component (name);
|
||||
idx_t length;
|
||||
int dotslash_len;
|
||||
if (*base)
|
||||
{
|
||||
length = base_len (base);
|
||||
size_t length;
|
||||
|
||||
/* Collapse a sequence of trailing slashes into one. */
|
||||
length += ISSLASH (base[length]);
|
||||
/* If there is no last component, then name is a file system root or the
|
||||
empty string. */
|
||||
if (! *base)
|
||||
return xstrndup (name, base_len (name));
|
||||
|
||||
/* On systems with drive letters, "a/b:c" must return "./b:c" rather
|
||||
than "b:c" to avoid confusion with a drive letter. On systems
|
||||
with pure POSIX semantics, this is not an issue. */
|
||||
dotslash_len = FILE_SYSTEM_PREFIX_LEN (base) != 0 ? 2 : 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* There is no last component, so NAME is a file system root or
|
||||
the empty string. */
|
||||
base = name;
|
||||
length = base_len (base);
|
||||
dotslash_len = 0;
|
||||
}
|
||||
/* Collapse a sequence of trailing slashes into one. */
|
||||
length = base_len (base);
|
||||
if (ISSLASH (base[length]))
|
||||
length++;
|
||||
|
||||
char *p = ximalloc (dotslash_len + length + 1);
|
||||
if (dotslash_len)
|
||||
/* On systems with drive letters, "a/b:c" must return "./b:c" rather
|
||||
than "b:c" to avoid confusion with a drive letter. On systems
|
||||
with pure POSIX semantics, this is not an issue. */
|
||||
if (FILE_SYSTEM_PREFIX_LEN (base))
|
||||
{
|
||||
char *p = xmalloc (length + 3);
|
||||
p[0] = '.';
|
||||
p[1] = '/';
|
||||
memcpy (p + 2, base, length);
|
||||
p[length + 2] = '\0';
|
||||
return p;
|
||||
}
|
||||
|
||||
/* Finally, copy the basename. */
|
||||
memcpy (p + dotslash_len, base, length);
|
||||
p[dotslash_len + length] = '\0';
|
||||
return p;
|
||||
return xstrndup (base, length);
|
||||
}
|
||||
|
|
18
gl/btowc.c
18
gl/btowc.c
|
@ -1,19 +1,19 @@
|
|||
/* Convert unibyte character to wide character.
|
||||
Copyright (C) 2008, 2010-2023 Free Software Foundation, Inc.
|
||||
Copyright (C) 2008, 2010-2013 Free Software Foundation, Inc.
|
||||
Written by Bruno Haible <bruno@clisp.org>, 2008.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
|
|
@ -1,44 +0,0 @@
|
|||
/* byteswap.h - Byte swapping
|
||||
Copyright (C) 2005, 2007, 2009-2023 Free Software Foundation, Inc.
|
||||
Written by Oskar Liljeblad <oskar@osk.mine.nu>, 2005.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _GL_BYTESWAP_H
|
||||
#define _GL_BYTESWAP_H
|
||||
|
||||
/* Given an unsigned 16-bit argument X, return the value corresponding to
|
||||
X with reversed byte order. */
|
||||
#define bswap_16(x) ((((x) & 0x00FF) << 8) | \
|
||||
(((x) & 0xFF00) >> 8))
|
||||
|
||||
/* Given an unsigned 32-bit argument X, return the value corresponding to
|
||||
X with reversed byte order. */
|
||||
#define bswap_32(x) ((((x) & 0x000000FF) << 24) | \
|
||||
(((x) & 0x0000FF00) << 8) | \
|
||||
(((x) & 0x00FF0000) >> 8) | \
|
||||
(((x) & 0xFF000000) >> 24))
|
||||
|
||||
/* Given an unsigned 64-bit argument X, return the value corresponding to
|
||||
X with reversed byte order. */
|
||||
#define bswap_64(x) ((((x) & 0x00000000000000FFULL) << 56) | \
|
||||
(((x) & 0x000000000000FF00ULL) << 40) | \
|
||||
(((x) & 0x0000000000FF0000ULL) << 24) | \
|
||||
(((x) & 0x00000000FF000000ULL) << 8) | \
|
||||
(((x) & 0x000000FF00000000ULL) >> 8) | \
|
||||
(((x) & 0x0000FF0000000000ULL) >> 24) | \
|
||||
(((x) & 0x00FF000000000000ULL) >> 40) | \
|
||||
(((x) & 0xFF00000000000000ULL) >> 56))
|
||||
|
||||
#endif /* _GL_BYTESWAP_H */
|
55
gl/calloc.c
55
gl/calloc.c
|
@ -1,55 +0,0 @@
|
|||
/* calloc() function that is glibc compatible.
|
||||
This wrapper function is required at least on Tru64 UNIX 5.1 and mingw.
|
||||
Copyright (C) 2004-2007, 2009-2023 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* written by Jim Meyering and Bruno Haible */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include "xalloc-oversized.h"
|
||||
|
||||
/* Call the system's calloc below. */
|
||||
#undef calloc
|
||||
|
||||
/* Allocate and zero-fill an NxS-byte block of memory from the heap,
|
||||
even if N or S is zero. */
|
||||
|
||||
void *
|
||||
rpl_calloc (size_t n, size_t s)
|
||||
{
|
||||
if (n == 0 || s == 0)
|
||||
n = s = 1;
|
||||
|
||||
if (xalloc_oversized (n, s))
|
||||
{
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void *result = calloc (n, s);
|
||||
|
||||
#if !HAVE_MALLOC_POSIX
|
||||
if (result == NULL)
|
||||
errno = ENOMEM;
|
||||
#endif
|
||||
|
||||
return result;
|
||||
}
|
707
gl/cdefs.h
707
gl/cdefs.h
|
@ -1,707 +0,0 @@
|
|||
/* Copyright (C) 1992-2023 Free Software Foundation, Inc.
|
||||
Copyright The GNU Toolchain Authors.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _SYS_CDEFS_H
|
||||
#define _SYS_CDEFS_H 1
|
||||
|
||||
/* We are almost always included from features.h. */
|
||||
#ifndef _FEATURES_H
|
||||
# include <features.h>
|
||||
#endif
|
||||
|
||||
/* The GNU libc does not support any K&R compilers or the traditional mode
|
||||
of ISO C compilers anymore. Check for some of the combinations not
|
||||
supported anymore. */
|
||||
#if defined __GNUC__ && !defined __STDC__
|
||||
# error "You need a ISO C conforming compiler to use the glibc headers"
|
||||
#endif
|
||||
|
||||
/* Some user header file might have defined this before. */
|
||||
#undef __P
|
||||
#undef __PMT
|
||||
|
||||
/* Compilers that lack __has_attribute may object to
|
||||
#if defined __has_attribute && __has_attribute (...)
|
||||
even though they do not need to evaluate the right-hand side of the &&.
|
||||
Similarly for __has_builtin, etc. */
|
||||
#if (defined __has_attribute \
|
||||
&& (!defined __clang_minor__ \
|
||||
|| (defined __apple_build_version__ \
|
||||
? 6000000 <= __apple_build_version__ \
|
||||
: 3 < __clang_major__ + (5 <= __clang_minor__))))
|
||||
# define __glibc_has_attribute(attr) __has_attribute (attr)
|
||||
#else
|
||||
# define __glibc_has_attribute(attr) 0
|
||||
#endif
|
||||
#ifdef __has_builtin
|
||||
# define __glibc_has_builtin(name) __has_builtin (name)
|
||||
#else
|
||||
# define __glibc_has_builtin(name) 0
|
||||
#endif
|
||||
#ifdef __has_extension
|
||||
# define __glibc_has_extension(ext) __has_extension (ext)
|
||||
#else
|
||||
# define __glibc_has_extension(ext) 0
|
||||
#endif
|
||||
|
||||
#if defined __GNUC__ || defined __clang__
|
||||
|
||||
/* All functions, except those with callbacks or those that
|
||||
synchronize memory, are leaf functions. */
|
||||
# if __GNUC_PREREQ (4, 6) && !defined _LIBC
|
||||
# define __LEAF , __leaf__
|
||||
# define __LEAF_ATTR __attribute__ ((__leaf__))
|
||||
# else
|
||||
# define __LEAF
|
||||
# define __LEAF_ATTR
|
||||
# endif
|
||||
|
||||
/* GCC can always grok prototypes. For C++ programs we add throw()
|
||||
to help it optimize the function calls. But this only works with
|
||||
gcc 2.8.x and egcs. For gcc 3.4 and up we even mark C functions
|
||||
as non-throwing using a function attribute since programs can use
|
||||
the -fexceptions options for C code as well. */
|
||||
# if !defined __cplusplus \
|
||||
&& (__GNUC_PREREQ (3, 4) || __glibc_has_attribute (__nothrow__))
|
||||
# define __THROW __attribute__ ((__nothrow__ __LEAF))
|
||||
# define __THROWNL __attribute__ ((__nothrow__))
|
||||
# define __NTH(fct) __attribute__ ((__nothrow__ __LEAF)) fct
|
||||
# define __NTHNL(fct) __attribute__ ((__nothrow__)) fct
|
||||
# else
|
||||
# if defined __cplusplus && (__GNUC_PREREQ (2,8) || __clang_major >= 4)
|
||||
# if __cplusplus >= 201103L
|
||||
# define __THROW noexcept (true)
|
||||
# else
|
||||
# define __THROW throw ()
|
||||
# endif
|
||||
# define __THROWNL __THROW
|
||||
# define __NTH(fct) __LEAF_ATTR fct __THROW
|
||||
# define __NTHNL(fct) fct __THROW
|
||||
# else
|
||||
# define __THROW
|
||||
# define __THROWNL
|
||||
# define __NTH(fct) fct
|
||||
# define __NTHNL(fct) fct
|
||||
# endif
|
||||
# endif
|
||||
|
||||
#else /* Not GCC or clang. */
|
||||
|
||||
# if (defined __cplusplus \
|
||||
|| (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L))
|
||||
# define __inline inline
|
||||
# else
|
||||
# define __inline /* No inline functions. */
|
||||
# endif
|
||||
|
||||
# define __THROW
|
||||
# define __THROWNL
|
||||
# define __NTH(fct) fct
|
||||
|
||||
#endif /* GCC || clang. */
|
||||
|
||||
/* These two macros are not used in glibc anymore. They are kept here
|
||||
only because some other projects expect the macros to be defined. */
|
||||
#define __P(args) args
|
||||
#define __PMT(args) args
|
||||
|
||||
/* For these things, GCC behaves the ANSI way normally,
|
||||
and the non-ANSI way under -traditional. */
|
||||
|
||||
#define __CONCAT(x,y) x ## y
|
||||
#define __STRING(x) #x
|
||||
|
||||
/* This is not a typedef so `const __ptr_t' does the right thing. */
|
||||
#define __ptr_t void *
|
||||
|
||||
|
||||
/* C++ needs to know that types and declarations are C, not C++. */
|
||||
#ifdef __cplusplus
|
||||
# define __BEGIN_DECLS extern "C" {
|
||||
# define __END_DECLS }
|
||||
#else
|
||||
# define __BEGIN_DECLS
|
||||
# define __END_DECLS
|
||||
#endif
|
||||
|
||||
|
||||
/* Fortify support. */
|
||||
#define __bos(ptr) __builtin_object_size (ptr, __USE_FORTIFY_LEVEL > 1)
|
||||
#define __bos0(ptr) __builtin_object_size (ptr, 0)
|
||||
|
||||
/* Use __builtin_dynamic_object_size at _FORTIFY_SOURCE=3 when available. */
|
||||
#if __USE_FORTIFY_LEVEL == 3 && (__glibc_clang_prereq (9, 0) \
|
||||
|| __GNUC_PREREQ (12, 0))
|
||||
# define __glibc_objsize0(__o) __builtin_dynamic_object_size (__o, 0)
|
||||
# define __glibc_objsize(__o) __builtin_dynamic_object_size (__o, 1)
|
||||
#else
|
||||
# define __glibc_objsize0(__o) __bos0 (__o)
|
||||
# define __glibc_objsize(__o) __bos (__o)
|
||||
#endif
|
||||
|
||||
/* Compile time conditions to choose between the regular, _chk and _chk_warn
|
||||
variants. These conditions should get evaluated to constant and optimized
|
||||
away. */
|
||||
|
||||
#define __glibc_safe_len_cond(__l, __s, __osz) ((__l) <= (__osz) / (__s))
|
||||
#define __glibc_unsigned_or_positive(__l) \
|
||||
((__typeof (__l)) 0 < (__typeof (__l)) -1 \
|
||||
|| (__builtin_constant_p (__l) && (__l) > 0))
|
||||
|
||||
/* Length is known to be safe at compile time if the __L * __S <= __OBJSZ
|
||||
condition can be folded to a constant and if it is true, or unknown (-1) */
|
||||
#define __glibc_safe_or_unknown_len(__l, __s, __osz) \
|
||||
((__osz) == (__SIZE_TYPE__) -1 \
|
||||
|| (__glibc_unsigned_or_positive (__l) \
|
||||
&& __builtin_constant_p (__glibc_safe_len_cond ((__SIZE_TYPE__) (__l), \
|
||||
(__s), (__osz))) \
|
||||
&& __glibc_safe_len_cond ((__SIZE_TYPE__) (__l), (__s), (__osz))))
|
||||
|
||||
/* Conversely, we know at compile time that the length is unsafe if the
|
||||
__L * __S <= __OBJSZ condition can be folded to a constant and if it is
|
||||
false. */
|
||||
#define __glibc_unsafe_len(__l, __s, __osz) \
|
||||
(__glibc_unsigned_or_positive (__l) \
|
||||
&& __builtin_constant_p (__glibc_safe_len_cond ((__SIZE_TYPE__) (__l), \
|
||||
__s, __osz)) \
|
||||
&& !__glibc_safe_len_cond ((__SIZE_TYPE__) (__l), __s, __osz))
|
||||
|
||||
/* Fortify function f. __f_alias, __f_chk and __f_chk_warn must be
|
||||
declared. */
|
||||
|
||||
#define __glibc_fortify(f, __l, __s, __osz, ...) \
|
||||
(__glibc_safe_or_unknown_len (__l, __s, __osz) \
|
||||
? __ ## f ## _alias (__VA_ARGS__) \
|
||||
: (__glibc_unsafe_len (__l, __s, __osz) \
|
||||
? __ ## f ## _chk_warn (__VA_ARGS__, __osz) \
|
||||
: __ ## f ## _chk (__VA_ARGS__, __osz))) \
|
||||
|
||||
/* Fortify function f, where object size argument passed to f is the number of
|
||||
elements and not total size. */
|
||||
|
||||
#define __glibc_fortify_n(f, __l, __s, __osz, ...) \
|
||||
(__glibc_safe_or_unknown_len (__l, __s, __osz) \
|
||||
? __ ## f ## _alias (__VA_ARGS__) \
|
||||
: (__glibc_unsafe_len (__l, __s, __osz) \
|
||||
? __ ## f ## _chk_warn (__VA_ARGS__, (__osz) / (__s)) \
|
||||
: __ ## f ## _chk (__VA_ARGS__, (__osz) / (__s)))) \
|
||||
|
||||
#if __GNUC_PREREQ (4,3)
|
||||
# define __warnattr(msg) __attribute__((__warning__ (msg)))
|
||||
# define __errordecl(name, msg) \
|
||||
extern void name (void) __attribute__((__error__ (msg)))
|
||||
#else
|
||||
# define __warnattr(msg)
|
||||
# define __errordecl(name, msg) extern void name (void)
|
||||
#endif
|
||||
|
||||
/* Support for flexible arrays.
|
||||
Headers that should use flexible arrays only if they're "real"
|
||||
(e.g. only if they won't affect sizeof()) should test
|
||||
#if __glibc_c99_flexarr_available. */
|
||||
#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L && !defined __HP_cc
|
||||
# define __flexarr []
|
||||
# define __glibc_c99_flexarr_available 1
|
||||
#elif __GNUC_PREREQ (2,97) || defined __clang__
|
||||
/* GCC 2.97 and clang support C99 flexible array members as an extension,
|
||||
even when in C89 mode or compiling C++ (any version). */
|
||||
# define __flexarr []
|
||||
# define __glibc_c99_flexarr_available 1
|
||||
#elif defined __GNUC__
|
||||
/* Pre-2.97 GCC did not support C99 flexible arrays but did have
|
||||
an equivalent extension with slightly different notation. */
|
||||
# define __flexarr [0]
|
||||
# define __glibc_c99_flexarr_available 1
|
||||
#else
|
||||
/* Some other non-C99 compiler. Approximate with [1]. */
|
||||
# define __flexarr [1]
|
||||
# define __glibc_c99_flexarr_available 0
|
||||
#endif
|
||||
|
||||
|
||||
/* __asm__ ("xyz") is used throughout the headers to rename functions
|
||||
at the assembly language level. This is wrapped by the __REDIRECT
|
||||
macro, in order to support compilers that can do this some other
|
||||
way. When compilers don't support asm-names at all, we have to do
|
||||
preprocessor tricks instead (which don't have exactly the right
|
||||
semantics, but it's the best we can do).
|
||||
|
||||
Example:
|
||||
int __REDIRECT(setpgrp, (__pid_t pid, __pid_t pgrp), setpgid); */
|
||||
|
||||
#if (defined __GNUC__ && __GNUC__ >= 2) || (__clang_major__ >= 4)
|
||||
|
||||
# define __REDIRECT(name, proto, alias) name proto __asm__ (__ASMNAME (#alias))
|
||||
# ifdef __cplusplus
|
||||
# define __REDIRECT_NTH(name, proto, alias) \
|
||||
name proto __THROW __asm__ (__ASMNAME (#alias))
|
||||
# define __REDIRECT_NTHNL(name, proto, alias) \
|
||||
name proto __THROWNL __asm__ (__ASMNAME (#alias))
|
||||
# else
|
||||
# define __REDIRECT_NTH(name, proto, alias) \
|
||||
name proto __asm__ (__ASMNAME (#alias)) __THROW
|
||||
# define __REDIRECT_NTHNL(name, proto, alias) \
|
||||
name proto __asm__ (__ASMNAME (#alias)) __THROWNL
|
||||
# endif
|
||||
# define __ASMNAME(cname) __ASMNAME2 (__USER_LABEL_PREFIX__, cname)
|
||||
# define __ASMNAME2(prefix, cname) __STRING (prefix) cname
|
||||
|
||||
/*
|
||||
#elif __SOME_OTHER_COMPILER__
|
||||
|
||||
# define __REDIRECT(name, proto, alias) name proto; \
|
||||
_Pragma("let " #name " = " #alias)
|
||||
*/
|
||||
#endif
|
||||
|
||||
/* GCC and clang have various useful declarations that can be made with
|
||||
the '__attribute__' syntax. All of the ways we use this do fine if
|
||||
they are omitted for compilers that don't understand it. */
|
||||
#if !(defined __GNUC__ || defined __clang__)
|
||||
# define __attribute__(xyz) /* Ignore */
|
||||
#endif
|
||||
|
||||
/* At some point during the gcc 2.96 development the `malloc' attribute
|
||||
for functions was introduced. We don't want to use it unconditionally
|
||||
(although this would be possible) since it generates warnings. */
|
||||
#if __GNUC_PREREQ (2,96) || __glibc_has_attribute (__malloc__)
|
||||
# define __attribute_malloc__ __attribute__ ((__malloc__))
|
||||
#else
|
||||
# define __attribute_malloc__ /* Ignore */
|
||||
#endif
|
||||
|
||||
/* Tell the compiler which arguments to an allocation function
|
||||
indicate the size of the allocation. */
|
||||
#if __GNUC_PREREQ (4, 3)
|
||||
# define __attribute_alloc_size__(params) \
|
||||
__attribute__ ((__alloc_size__ params))
|
||||
#else
|
||||
# define __attribute_alloc_size__(params) /* Ignore. */
|
||||
#endif
|
||||
|
||||
/* Tell the compiler which argument to an allocation function
|
||||
indicates the alignment of the allocation. */
|
||||
#if __GNUC_PREREQ (4, 9) || __glibc_has_attribute (__alloc_align__)
|
||||
# define __attribute_alloc_align__(param) \
|
||||
__attribute__ ((__alloc_align__ param))
|
||||
#else
|
||||
# define __attribute_alloc_align__(param) /* Ignore. */
|
||||
#endif
|
||||
|
||||
/* At some point during the gcc 2.96 development the `pure' attribute
|
||||
for functions was introduced. We don't want to use it unconditionally
|
||||
(although this would be possible) since it generates warnings. */
|
||||
#if __GNUC_PREREQ (2,96) || __glibc_has_attribute (__pure__)
|
||||
# define __attribute_pure__ __attribute__ ((__pure__))
|
||||
#else
|
||||
# define __attribute_pure__ /* Ignore */
|
||||
#endif
|
||||
|
||||
/* This declaration tells the compiler that the value is constant. */
|
||||
#if __GNUC_PREREQ (2,5) || __glibc_has_attribute (__const__)
|
||||
# define __attribute_const__ __attribute__ ((__const__))
|
||||
#else
|
||||
# define __attribute_const__ /* Ignore */
|
||||
#endif
|
||||
|
||||
#if __GNUC_PREREQ (2,7) || __glibc_has_attribute (__unused__)
|
||||
# define __attribute_maybe_unused__ __attribute__ ((__unused__))
|
||||
#else
|
||||
# define __attribute_maybe_unused__ /* Ignore */
|
||||
#endif
|
||||
|
||||
/* At some point during the gcc 3.1 development the `used' attribute
|
||||
for functions was introduced. We don't want to use it unconditionally
|
||||
(although this would be possible) since it generates warnings. */
|
||||
#if __GNUC_PREREQ (3,1) || __glibc_has_attribute (__used__)
|
||||
# define __attribute_used__ __attribute__ ((__used__))
|
||||
# define __attribute_noinline__ __attribute__ ((__noinline__))
|
||||
#else
|
||||
# define __attribute_used__ __attribute__ ((__unused__))
|
||||
# define __attribute_noinline__ /* Ignore */
|
||||
#endif
|
||||
|
||||
/* Since version 3.2, gcc allows marking deprecated functions. */
|
||||
#if __GNUC_PREREQ (3,2) || __glibc_has_attribute (__deprecated__)
|
||||
# define __attribute_deprecated__ __attribute__ ((__deprecated__))
|
||||
#else
|
||||
# define __attribute_deprecated__ /* Ignore */
|
||||
#endif
|
||||
|
||||
/* Since version 4.5, gcc also allows one to specify the message printed
|
||||
when a deprecated function is used. clang claims to be gcc 4.2, but
|
||||
may also support this feature. */
|
||||
#if __GNUC_PREREQ (4,5) \
|
||||
|| __glibc_has_extension (__attribute_deprecated_with_message__)
|
||||
# define __attribute_deprecated_msg__(msg) \
|
||||
__attribute__ ((__deprecated__ (msg)))
|
||||
#else
|
||||
# define __attribute_deprecated_msg__(msg) __attribute_deprecated__
|
||||
#endif
|
||||
|
||||
/* At some point during the gcc 2.8 development the `format_arg' attribute
|
||||
for functions was introduced. We don't want to use it unconditionally
|
||||
(although this would be possible) since it generates warnings.
|
||||
If several `format_arg' attributes are given for the same function, in
|
||||
gcc-3.0 and older, all but the last one are ignored. In newer gccs,
|
||||
all designated arguments are considered. */
|
||||
#if __GNUC_PREREQ (2,8) || __glibc_has_attribute (__format_arg__)
|
||||
# define __attribute_format_arg__(x) __attribute__ ((__format_arg__ (x)))
|
||||
#else
|
||||
# define __attribute_format_arg__(x) /* Ignore */
|
||||
#endif
|
||||
|
||||
/* At some point during the gcc 2.97 development the `strfmon' format
|
||||
attribute for functions was introduced. We don't want to use it
|
||||
unconditionally (although this would be possible) since it
|
||||
generates warnings. */
|
||||
#if __GNUC_PREREQ (2,97) || __glibc_has_attribute (__format__)
|
||||
# define __attribute_format_strfmon__(a,b) \
|
||||
__attribute__ ((__format__ (__strfmon__, a, b)))
|
||||
#else
|
||||
# define __attribute_format_strfmon__(a,b) /* Ignore */
|
||||
#endif
|
||||
|
||||
/* The nonnull function attribute marks pointer parameters that
|
||||
must not be NULL. This has the name __nonnull in glibc,
|
||||
and __attribute_nonnull__ in files shared with Gnulib to avoid
|
||||
collision with a different __nonnull in DragonFlyBSD 5.9. */
|
||||
#ifndef __attribute_nonnull__
|
||||
# if __GNUC_PREREQ (3,3) || __glibc_has_attribute (__nonnull__)
|
||||
# define __attribute_nonnull__(params) __attribute__ ((__nonnull__ params))
|
||||
# else
|
||||
# define __attribute_nonnull__(params)
|
||||
# endif
|
||||
#endif
|
||||
#ifndef __nonnull
|
||||
# define __nonnull(params) __attribute_nonnull__ (params)
|
||||
#endif
|
||||
|
||||
/* The returns_nonnull function attribute marks the return type of the function
|
||||
as always being non-null. */
|
||||
#ifndef __returns_nonnull
|
||||
# if __GNUC_PREREQ (4, 9) || __glibc_has_attribute (__returns_nonnull__)
|
||||
# define __returns_nonnull __attribute__ ((__returns_nonnull__))
|
||||
# else
|
||||
# define __returns_nonnull
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* If fortification mode, we warn about unused results of certain
|
||||
function calls which can lead to problems. */
|
||||
#if __GNUC_PREREQ (3,4) || __glibc_has_attribute (__warn_unused_result__)
|
||||
# define __attribute_warn_unused_result__ \
|
||||
__attribute__ ((__warn_unused_result__))
|
||||
# if defined __USE_FORTIFY_LEVEL && __USE_FORTIFY_LEVEL > 0
|
||||
# define __wur __attribute_warn_unused_result__
|
||||
# endif
|
||||
#else
|
||||
# define __attribute_warn_unused_result__ /* empty */
|
||||
#endif
|
||||
#ifndef __wur
|
||||
# define __wur /* Ignore */
|
||||
#endif
|
||||
|
||||
/* Forces a function to be always inlined. */
|
||||
#if __GNUC_PREREQ (3,2) || __glibc_has_attribute (__always_inline__)
|
||||
/* The Linux kernel defines __always_inline in stddef.h (283d7573), and
|
||||
it conflicts with this definition. Therefore undefine it first to
|
||||
allow either header to be included first. */
|
||||
# undef __always_inline
|
||||
# define __always_inline __inline __attribute__ ((__always_inline__))
|
||||
#else
|
||||
# undef __always_inline
|
||||
# define __always_inline __inline
|
||||
#endif
|
||||
|
||||
/* Associate error messages with the source location of the call site rather
|
||||
than with the source location inside the function. */
|
||||
#if __GNUC_PREREQ (4,3) || __glibc_has_attribute (__artificial__)
|
||||
# define __attribute_artificial__ __attribute__ ((__artificial__))
|
||||
#else
|
||||
# define __attribute_artificial__ /* Ignore */
|
||||
#endif
|
||||
|
||||
/* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
|
||||
inline semantics, unless -fgnu89-inline is used. Using __GNUC_STDC_INLINE__
|
||||
or __GNUC_GNU_INLINE is not a good enough check for gcc because gcc versions
|
||||
older than 4.3 may define these macros and still not guarantee GNU inlining
|
||||
semantics.
|
||||
|
||||
clang++ identifies itself as gcc-4.2, but has support for GNU inlining
|
||||
semantics, that can be checked for by using the __GNUC_STDC_INLINE_ and
|
||||
__GNUC_GNU_INLINE__ macro definitions. */
|
||||
#if (!defined __cplusplus || __GNUC_PREREQ (4,3) \
|
||||
|| (defined __clang__ && (defined __GNUC_STDC_INLINE__ \
|
||||
|| defined __GNUC_GNU_INLINE__)))
|
||||
# if defined __GNUC_STDC_INLINE__ || defined __cplusplus
|
||||
# define __extern_inline extern __inline __attribute__ ((__gnu_inline__))
|
||||
# define __extern_always_inline \
|
||||
extern __always_inline __attribute__ ((__gnu_inline__))
|
||||
# else
|
||||
# define __extern_inline extern __inline
|
||||
# define __extern_always_inline extern __always_inline
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef __extern_always_inline
|
||||
# define __fortify_function __extern_always_inline __attribute_artificial__
|
||||
#endif
|
||||
|
||||
/* GCC 4.3 and above allow passing all anonymous arguments of an
|
||||
__extern_always_inline function to some other vararg function. */
|
||||
#if __GNUC_PREREQ (4,3)
|
||||
# define __va_arg_pack() __builtin_va_arg_pack ()
|
||||
# define __va_arg_pack_len() __builtin_va_arg_pack_len ()
|
||||
#endif
|
||||
|
||||
/* It is possible to compile containing GCC extensions even if GCC is
|
||||
run in pedantic mode if the uses are carefully marked using the
|
||||
`__extension__' keyword. But this is not generally available before
|
||||
version 2.8. */
|
||||
#if !(__GNUC_PREREQ (2,8) || defined __clang__)
|
||||
# define __extension__ /* Ignore */
|
||||
#endif
|
||||
|
||||
/* __restrict is known in EGCS 1.2 and above, and in clang.
|
||||
It works also in C++ mode (outside of arrays), but only when spelled
|
||||
as '__restrict', not 'restrict'. */
|
||||
#if !(__GNUC_PREREQ (2,92) || __clang_major__ >= 3)
|
||||
# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
|
||||
# define __restrict restrict
|
||||
# else
|
||||
# define __restrict /* Ignore */
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* ISO C99 also allows to declare arrays as non-overlapping. The syntax is
|
||||
array_name[restrict]
|
||||
GCC 3.1 and clang support this.
|
||||
This syntax is not usable in C++ mode. */
|
||||
#if (__GNUC_PREREQ (3,1) || __clang_major__ >= 3) && !defined __cplusplus
|
||||
# define __restrict_arr __restrict
|
||||
#else
|
||||
# ifdef __GNUC__
|
||||
# define __restrict_arr /* Not supported in old GCC. */
|
||||
# else
|
||||
# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
|
||||
# define __restrict_arr restrict
|
||||
# else
|
||||
/* Some other non-C99 compiler. */
|
||||
# define __restrict_arr /* Not supported. */
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if (__GNUC__ >= 3) || __glibc_has_builtin (__builtin_expect)
|
||||
# define __glibc_unlikely(cond) __builtin_expect ((cond), 0)
|
||||
# define __glibc_likely(cond) __builtin_expect ((cond), 1)
|
||||
#else
|
||||
# define __glibc_unlikely(cond) (cond)
|
||||
# define __glibc_likely(cond) (cond)
|
||||
#endif
|
||||
|
||||
#if (!defined _Noreturn \
|
||||
&& (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \
|
||||
&& !(__GNUC_PREREQ (4,7) \
|
||||
|| (3 < __clang_major__ + (5 <= __clang_minor__))))
|
||||
# if __GNUC_PREREQ (2,8)
|
||||
# define _Noreturn __attribute__ ((__noreturn__))
|
||||
# else
|
||||
# define _Noreturn
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if __GNUC_PREREQ (8, 0)
|
||||
/* Describes a char array whose address can safely be passed as the first
|
||||
argument to strncpy and strncat, as the char array is not necessarily
|
||||
a NUL-terminated string. */
|
||||
# define __attribute_nonstring__ __attribute__ ((__nonstring__))
|
||||
#else
|
||||
# define __attribute_nonstring__
|
||||
#endif
|
||||
|
||||
/* Undefine (also defined in libc-symbols.h). */
|
||||
#undef __attribute_copy__
|
||||
#if __GNUC_PREREQ (9, 0)
|
||||
/* Copies attributes from the declaration or type referenced by
|
||||
the argument. */
|
||||
# define __attribute_copy__(arg) __attribute__ ((__copy__ (arg)))
|
||||
#else
|
||||
# define __attribute_copy__(arg)
|
||||
#endif
|
||||
|
||||
#if (!defined _Static_assert && !defined __cplusplus \
|
||||
&& (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \
|
||||
&& (!(__GNUC_PREREQ (4, 6) || __clang_major__ >= 4) \
|
||||
|| defined __STRICT_ANSI__))
|
||||
# define _Static_assert(expr, diagnostic) \
|
||||
extern int (*__Static_assert_function (void)) \
|
||||
[!!sizeof (struct { int __error_if_negative: (expr) ? 2 : -1; })]
|
||||
#endif
|
||||
|
||||
/* Gnulib avoids including these, as they don't work on non-glibc or
|
||||
older glibc platforms. */
|
||||
#ifndef __GNULIB_CDEFS
|
||||
# include <bits/wordsize.h>
|
||||
# include <bits/long-double.h>
|
||||
#endif
|
||||
|
||||
#if __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1
|
||||
# ifdef __REDIRECT
|
||||
|
||||
/* Alias name defined automatically. */
|
||||
# define __LDBL_REDIR(name, proto) ... unused__ldbl_redir
|
||||
# define __LDBL_REDIR_DECL(name) \
|
||||
extern __typeof (name) name __asm (__ASMNAME ("__" #name "ieee128"));
|
||||
|
||||
/* Alias name defined automatically, with leading underscores. */
|
||||
# define __LDBL_REDIR2_DECL(name) \
|
||||
extern __typeof (__##name) __##name \
|
||||
__asm (__ASMNAME ("__" #name "ieee128"));
|
||||
|
||||
/* Alias name defined manually. */
|
||||
# define __LDBL_REDIR1(name, proto, alias) ... unused__ldbl_redir1
|
||||
# define __LDBL_REDIR1_DECL(name, alias) \
|
||||
extern __typeof (name) name __asm (__ASMNAME (#alias));
|
||||
|
||||
# define __LDBL_REDIR1_NTH(name, proto, alias) \
|
||||
__REDIRECT_NTH (name, proto, alias)
|
||||
# define __REDIRECT_NTH_LDBL(name, proto, alias) \
|
||||
__LDBL_REDIR1_NTH (name, proto, __##alias##ieee128)
|
||||
|
||||
/* Unused. */
|
||||
# define __REDIRECT_LDBL(name, proto, alias) ... unused__redirect_ldbl
|
||||
# define __LDBL_REDIR_NTH(name, proto) ... unused__ldbl_redir_nth
|
||||
|
||||
# else
|
||||
_Static_assert (0, "IEEE 128-bits long double requires redirection on this platform");
|
||||
# endif
|
||||
#elif defined __LONG_DOUBLE_MATH_OPTIONAL && defined __NO_LONG_DOUBLE_MATH
|
||||
# define __LDBL_COMPAT 1
|
||||
# ifdef __REDIRECT
|
||||
# define __LDBL_REDIR1(name, proto, alias) __REDIRECT (name, proto, alias)
|
||||
# define __LDBL_REDIR(name, proto) \
|
||||
__LDBL_REDIR1 (name, proto, __nldbl_##name)
|
||||
# define __LDBL_REDIR1_NTH(name, proto, alias) __REDIRECT_NTH (name, proto, alias)
|
||||
# define __LDBL_REDIR_NTH(name, proto) \
|
||||
__LDBL_REDIR1_NTH (name, proto, __nldbl_##name)
|
||||
# define __LDBL_REDIR2_DECL(name) \
|
||||
extern __typeof (__##name) __##name __asm (__ASMNAME ("__nldbl___" #name));
|
||||
# define __LDBL_REDIR1_DECL(name, alias) \
|
||||
extern __typeof (name) name __asm (__ASMNAME (#alias));
|
||||
# define __LDBL_REDIR_DECL(name) \
|
||||
extern __typeof (name) name __asm (__ASMNAME ("__nldbl_" #name));
|
||||
# define __REDIRECT_LDBL(name, proto, alias) \
|
||||
__LDBL_REDIR1 (name, proto, __nldbl_##alias)
|
||||
# define __REDIRECT_NTH_LDBL(name, proto, alias) \
|
||||
__LDBL_REDIR1_NTH (name, proto, __nldbl_##alias)
|
||||
# endif
|
||||
#endif
|
||||
#if (!defined __LDBL_COMPAT && __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 0) \
|
||||
|| !defined __REDIRECT
|
||||
# define __LDBL_REDIR1(name, proto, alias) name proto
|
||||
# define __LDBL_REDIR(name, proto) name proto
|
||||
# define __LDBL_REDIR1_NTH(name, proto, alias) name proto __THROW
|
||||
# define __LDBL_REDIR_NTH(name, proto) name proto __THROW
|
||||
# define __LDBL_REDIR2_DECL(name)
|
||||
# define __LDBL_REDIR_DECL(name)
|
||||
# ifdef __REDIRECT
|
||||
# define __REDIRECT_LDBL(name, proto, alias) __REDIRECT (name, proto, alias)
|
||||
# define __REDIRECT_NTH_LDBL(name, proto, alias) \
|
||||
__REDIRECT_NTH (name, proto, alias)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* __glibc_macro_warning (MESSAGE) issues warning MESSAGE. This is
|
||||
intended for use in preprocessor macros.
|
||||
|
||||
Note: MESSAGE must be a _single_ string; concatenation of string
|
||||
literals is not supported. */
|
||||
#if __GNUC_PREREQ (4,8) || __glibc_clang_prereq (3,5)
|
||||
# define __glibc_macro_warning1(message) _Pragma (#message)
|
||||
# define __glibc_macro_warning(message) \
|
||||
__glibc_macro_warning1 (GCC warning message)
|
||||
#else
|
||||
# define __glibc_macro_warning(msg)
|
||||
#endif
|
||||
|
||||
/* Generic selection (ISO C11) is a C-only feature, available in GCC
|
||||
since version 4.9. Previous versions do not provide generic
|
||||
selection, even though they might set __STDC_VERSION__ to 201112L,
|
||||
when in -std=c11 mode. Thus, we must check for !defined __GNUC__
|
||||
when testing __STDC_VERSION__ for generic selection support.
|
||||
On the other hand, Clang also defines __GNUC__, so a clang-specific
|
||||
check is required to enable the use of generic selection. */
|
||||
#if !defined __cplusplus \
|
||||
&& (__GNUC_PREREQ (4, 9) \
|
||||
|| __glibc_has_extension (c_generic_selections) \
|
||||
|| (!defined __GNUC__ && defined __STDC_VERSION__ \
|
||||
&& __STDC_VERSION__ >= 201112L))
|
||||
# define __HAVE_GENERIC_SELECTION 1
|
||||
#else
|
||||
# define __HAVE_GENERIC_SELECTION 0
|
||||
#endif
|
||||
|
||||
#if __GNUC_PREREQ (10, 0)
|
||||
/* Designates a 1-based positional argument ref-index of pointer type
|
||||
that can be used to access size-index elements of the pointed-to
|
||||
array according to access mode, or at least one element when
|
||||
size-index is not provided:
|
||||
access (access-mode, <ref-index> [, <size-index>]) */
|
||||
# define __attr_access(x) __attribute__ ((__access__ x))
|
||||
/* For _FORTIFY_SOURCE == 3 we use __builtin_dynamic_object_size, which may
|
||||
use the access attribute to get object sizes from function definition
|
||||
arguments, so we can't use them on functions we fortify. Drop the object
|
||||
size hints for such functions. */
|
||||
# if __USE_FORTIFY_LEVEL == 3
|
||||
# define __fortified_attr_access(a, o, s) __attribute__ ((__access__ (a, o)))
|
||||
# else
|
||||
# define __fortified_attr_access(a, o, s) __attr_access ((a, o, s))
|
||||
# endif
|
||||
# if __GNUC_PREREQ (11, 0)
|
||||
# define __attr_access_none(argno) __attribute__ ((__access__ (__none__, argno)))
|
||||
# else
|
||||
# define __attr_access_none(argno)
|
||||
# endif
|
||||
#else
|
||||
# define __fortified_attr_access(a, o, s)
|
||||
# define __attr_access(x)
|
||||
# define __attr_access_none(argno)
|
||||
#endif
|
||||
|
||||
#if __GNUC_PREREQ (11, 0)
|
||||
/* Designates dealloc as a function to call to deallocate objects
|
||||
allocated by the declared function. */
|
||||
# define __attr_dealloc(dealloc, argno) \
|
||||
__attribute__ ((__malloc__ (dealloc, argno)))
|
||||
# define __attr_dealloc_free __attr_dealloc (__builtin_free, 1)
|
||||
#else
|
||||
# define __attr_dealloc(dealloc, argno)
|
||||
# define __attr_dealloc_free
|
||||
#endif
|
||||
|
||||
/* Specify that a function such as setjmp or vfork may return
|
||||
twice. */
|
||||
#if __GNUC_PREREQ (4, 1)
|
||||
# define __attribute_returns_twice__ __attribute__ ((__returns_twice__))
|
||||
#else
|
||||
# define __attribute_returns_twice__ /* Ignore. */
|
||||
#endif
|
||||
|
||||
#endif /* sys/cdefs.h */
|
83
gl/cloexec.c
83
gl/cloexec.c
|
@ -1,83 +0,0 @@
|
|||
/* cloexec.c - set or clear the close-on-exec descriptor flag
|
||||
|
||||
Copyright (C) 1991, 2004-2006, 2009-2023 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* The code is taken from glibc/manual/llio.texi */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "cloexec.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* Set the 'FD_CLOEXEC' flag of DESC if VALUE is true,
|
||||
or clear the flag if VALUE is false.
|
||||
Return 0 on success, or -1 on error with 'errno' set.
|
||||
|
||||
Note that on MingW, this function does NOT protect DESC from being
|
||||
inherited into spawned children. Instead, either use dup_cloexec
|
||||
followed by closing the original DESC, or use interfaces such as
|
||||
open or pipe2 that accept flags like O_CLOEXEC to create DESC
|
||||
non-inheritable in the first place. */
|
||||
|
||||
int
|
||||
set_cloexec_flag (int desc, bool value)
|
||||
{
|
||||
#ifdef F_SETFD
|
||||
|
||||
int flags = fcntl (desc, F_GETFD, 0);
|
||||
|
||||
if (0 <= flags)
|
||||
{
|
||||
int newflags = (value ? flags | FD_CLOEXEC : flags & ~FD_CLOEXEC);
|
||||
|
||||
if (flags == newflags
|
||||
|| fcntl (desc, F_SETFD, newflags) != -1)
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -1;
|
||||
|
||||
#else /* !F_SETFD */
|
||||
|
||||
/* Use dup2 to reject invalid file descriptors; the cloexec flag
|
||||
will be unaffected. */
|
||||
if (desc < 0)
|
||||
{
|
||||
errno = EBADF;
|
||||
return -1;
|
||||
}
|
||||
if (dup2 (desc, desc) < 0)
|
||||
/* errno is EBADF here. */
|
||||
return -1;
|
||||
|
||||
/* There is nothing we can do on this kind of platform. Punt. */
|
||||
return 0;
|
||||
#endif /* !F_SETFD */
|
||||
}
|
||||
|
||||
|
||||
/* Duplicates a file handle FD, while marking the copy to be closed
|
||||
prior to exec or spawn. Returns -1 and sets errno if FD could not
|
||||
be duplicated. */
|
||||
|
||||
int
|
||||
dup_cloexec (int fd)
|
||||
{
|
||||
return fcntl (fd, F_DUPFD_CLOEXEC, 0);
|
||||
}
|
34
gl/cloexec.h
34
gl/cloexec.h
|
@ -1,34 +0,0 @@
|
|||
/* cloexec.c - set or clear the close-on-exec descriptor flag
|
||||
|
||||
Copyright (C) 2004, 2009-2023 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Set the 'FD_CLOEXEC' flag of DESC if VALUE is true,
|
||||
or clear the flag if VALUE is false.
|
||||
Return 0 on success, or -1 on error with 'errno' set.
|
||||
|
||||
Note that on MingW, this function does NOT protect DESC from being
|
||||
inherited into spawned children. Instead, either use dup_cloexec
|
||||
followed by closing the original DESC, or use interfaces such as
|
||||
open or pipe2 that accept flags like O_CLOEXEC to create DESC
|
||||
non-inheritable in the first place. */
|
||||
|
||||
int set_cloexec_flag (int desc, bool value);
|
||||
|
||||
/* Duplicates a file handle FD, while marking the copy to be closed
|
||||
prior to exec or spawn. Returns -1 and sets errno if FD could not
|
||||
be duplicated. */
|
||||
|
||||
int dup_cloexec (int fd);
|
75
gl/close.c
75
gl/close.c
|
@ -1,75 +0,0 @@
|
|||
/* close replacement.
|
||||
Copyright (C) 2008-2023 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include <unistd.h>
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include "fd-hook.h"
|
||||
#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
|
||||
# include "msvc-inval.h"
|
||||
#endif
|
||||
|
||||
#undef close
|
||||
|
||||
#if defined _WIN32 && !defined __CYGWIN__
|
||||
# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
|
||||
static int
|
||||
close_nothrow (int fd)
|
||||
{
|
||||
int result;
|
||||
|
||||
TRY_MSVC_INVAL
|
||||
{
|
||||
result = _close (fd);
|
||||
}
|
||||
CATCH_MSVC_INVAL
|
||||
{
|
||||
result = -1;
|
||||
errno = EBADF;
|
||||
}
|
||||
DONE_MSVC_INVAL;
|
||||
|
||||
return result;
|
||||
}
|
||||
# else
|
||||
# define close_nothrow _close
|
||||
# endif
|
||||
#else
|
||||
# define close_nothrow close
|
||||
#endif
|
||||
|
||||
/* Override close() to call into other gnulib modules. */
|
||||
|
||||
int
|
||||
rpl_close (int fd)
|
||||
{
|
||||
#if WINDOWS_SOCKETS
|
||||
int retval = execute_all_close_hooks (close_nothrow, fd);
|
||||
#else
|
||||
int retval = close_nothrow (fd);
|
||||
#endif
|
||||
|
||||
#if REPLACE_FCHDIR
|
||||
if (retval >= 0)
|
||||
_gl_unregister_fd (fd);
|
||||
#endif
|
||||
|
||||
return retval;
|
||||
}
|
684
gl/config.charset
Normal file
684
gl/config.charset
Normal file
|
@ -0,0 +1,684 @@
|
|||
#! /bin/sh
|
||||
# Output a system dependent table of character encoding aliases.
|
||||
#
|
||||
# Copyright (C) 2000-2004, 2006-2013 Free Software Foundation, Inc.
|
||||
#
|
||||
# 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, 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 <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# The table consists of lines of the form
|
||||
# ALIAS CANONICAL
|
||||
#
|
||||
# ALIAS is the (system dependent) result of "nl_langinfo (CODESET)".
|
||||
# ALIAS is compared in a case sensitive way.
|
||||
#
|
||||
# CANONICAL is the GNU canonical name for this character encoding.
|
||||
# It must be an encoding supported by libiconv. Support by GNU libc is
|
||||
# also desirable. CANONICAL is case insensitive. Usually an upper case
|
||||
# MIME charset name is preferred.
|
||||
# The current list of GNU canonical charset names is as follows.
|
||||
#
|
||||
# name MIME? used by which systems
|
||||
# (darwin = Mac OS X, woe32 = native Windows)
|
||||
#
|
||||
# ASCII, ANSI_X3.4-1968 glibc solaris freebsd netbsd darwin cygwin
|
||||
# ISO-8859-1 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin
|
||||
# ISO-8859-2 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin
|
||||
# ISO-8859-3 Y glibc solaris cygwin
|
||||
# ISO-8859-4 Y osf solaris freebsd netbsd openbsd darwin
|
||||
# ISO-8859-5 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin
|
||||
# ISO-8859-6 Y glibc aix hpux solaris cygwin
|
||||
# ISO-8859-7 Y glibc aix hpux irix osf solaris netbsd openbsd darwin cygwin
|
||||
# ISO-8859-8 Y glibc aix hpux osf solaris cygwin
|
||||
# ISO-8859-9 Y glibc aix hpux irix osf solaris darwin cygwin
|
||||
# ISO-8859-13 glibc netbsd openbsd darwin cygwin
|
||||
# ISO-8859-14 glibc cygwin
|
||||
# ISO-8859-15 glibc aix osf solaris freebsd netbsd openbsd darwin cygwin
|
||||
# KOI8-R Y glibc solaris freebsd netbsd openbsd darwin
|
||||
# KOI8-U Y glibc freebsd netbsd openbsd darwin cygwin
|
||||
# KOI8-T glibc
|
||||
# CP437 dos
|
||||
# CP775 dos
|
||||
# CP850 aix osf dos
|
||||
# CP852 dos
|
||||
# CP855 dos
|
||||
# CP856 aix
|
||||
# CP857 dos
|
||||
# CP861 dos
|
||||
# CP862 dos
|
||||
# CP864 dos
|
||||
# CP865 dos
|
||||
# CP866 freebsd netbsd openbsd darwin dos
|
||||
# CP869 dos
|
||||
# CP874 woe32 dos
|
||||
# CP922 aix
|
||||
# CP932 aix cygwin woe32 dos
|
||||
# CP943 aix
|
||||
# CP949 osf darwin woe32 dos
|
||||
# CP950 woe32 dos
|
||||
# CP1046 aix
|
||||
# CP1124 aix
|
||||
# CP1125 dos
|
||||
# CP1129 aix
|
||||
# CP1131 darwin
|
||||
# CP1250 woe32
|
||||
# CP1251 glibc solaris netbsd openbsd darwin cygwin woe32
|
||||
# CP1252 aix woe32
|
||||
# CP1253 woe32
|
||||
# CP1254 woe32
|
||||
# CP1255 glibc woe32
|
||||
# CP1256 woe32
|
||||
# CP1257 woe32
|
||||
# GB2312 Y glibc aix hpux irix solaris freebsd netbsd darwin
|
||||
# EUC-JP Y glibc aix hpux irix osf solaris freebsd netbsd darwin
|
||||
# EUC-KR Y glibc aix hpux irix osf solaris freebsd netbsd darwin cygwin
|
||||
# EUC-TW glibc aix hpux irix osf solaris netbsd
|
||||
# BIG5 Y glibc aix hpux osf solaris freebsd netbsd darwin cygwin
|
||||
# BIG5-HKSCS glibc solaris darwin
|
||||
# GBK glibc aix osf solaris darwin cygwin woe32 dos
|
||||
# GB18030 glibc solaris netbsd darwin
|
||||
# SHIFT_JIS Y hpux osf solaris freebsd netbsd darwin
|
||||
# JOHAB glibc solaris woe32
|
||||
# TIS-620 glibc aix hpux osf solaris cygwin
|
||||
# VISCII Y glibc
|
||||
# TCVN5712-1 glibc
|
||||
# ARMSCII-8 glibc darwin
|
||||
# GEORGIAN-PS glibc cygwin
|
||||
# PT154 glibc
|
||||
# HP-ROMAN8 hpux
|
||||
# HP-ARABIC8 hpux
|
||||
# HP-GREEK8 hpux
|
||||
# HP-HEBREW8 hpux
|
||||
# HP-TURKISH8 hpux
|
||||
# HP-KANA8 hpux
|
||||
# DEC-KANJI osf
|
||||
# DEC-HANYU osf
|
||||
# UTF-8 Y glibc aix hpux osf solaris netbsd darwin cygwin
|
||||
#
|
||||
# Note: Names which are not marked as being a MIME name should not be used in
|
||||
# Internet protocols for information interchange (mail, news, etc.).
|
||||
#
|
||||
# Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications
|
||||
# must understand both names and treat them as equivalent.
|
||||
#
|
||||
# The first argument passed to this file is the canonical host specification,
|
||||
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
|
||||
# or
|
||||
# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
|
||||
|
||||
host="$1"
|
||||
os=`echo "$host" | sed -e 's/^[^-]*-[^-]*-\(.*\)$/\1/'`
|
||||
echo "# This file contains a table of character encoding aliases,"
|
||||
echo "# suitable for operating system '${os}'."
|
||||
echo "# It was automatically generated from config.charset."
|
||||
# List of references, updated during installation:
|
||||
echo "# Packages using this file: "
|
||||
case "$os" in
|
||||
linux-gnulibc1*)
|
||||
# Linux libc5 doesn't have nl_langinfo(CODESET); therefore
|
||||
# localcharset.c falls back to using the full locale name
|
||||
# from the environment variables.
|
||||
echo "C ASCII"
|
||||
echo "POSIX ASCII"
|
||||
for l in af af_ZA ca ca_ES da da_DK de de_AT de_BE de_CH de_DE de_LU \
|
||||
en en_AU en_BW en_CA en_DK en_GB en_IE en_NZ en_US en_ZA \
|
||||
en_ZW es es_AR es_BO es_CL es_CO es_DO es_EC es_ES es_GT \
|
||||
es_HN es_MX es_PA es_PE es_PY es_SV es_US es_UY es_VE et \
|
||||
et_EE eu eu_ES fi fi_FI fo fo_FO fr fr_BE fr_CA fr_CH fr_FR \
|
||||
fr_LU ga ga_IE gl gl_ES id id_ID in in_ID is is_IS it it_CH \
|
||||
it_IT kl kl_GL nl nl_BE nl_NL no no_NO pt pt_BR pt_PT sv \
|
||||
sv_FI sv_SE; do
|
||||
echo "$l ISO-8859-1"
|
||||
echo "$l.iso-8859-1 ISO-8859-1"
|
||||
echo "$l.iso-8859-15 ISO-8859-15"
|
||||
echo "$l.iso-8859-15@euro ISO-8859-15"
|
||||
echo "$l@euro ISO-8859-15"
|
||||
echo "$l.cp-437 CP437"
|
||||
echo "$l.cp-850 CP850"
|
||||
echo "$l.cp-1252 CP1252"
|
||||
echo "$l.cp-1252@euro CP1252"
|
||||
#echo "$l.atari-st ATARI-ST" # not a commonly used encoding
|
||||
echo "$l.utf-8 UTF-8"
|
||||
echo "$l.utf-8@euro UTF-8"
|
||||
done
|
||||
for l in cs cs_CZ hr hr_HR hu hu_HU pl pl_PL ro ro_RO sk sk_SK sl \
|
||||
sl_SI sr sr_CS sr_YU; do
|
||||
echo "$l ISO-8859-2"
|
||||
echo "$l.iso-8859-2 ISO-8859-2"
|
||||
echo "$l.cp-852 CP852"
|
||||
echo "$l.cp-1250 CP1250"
|
||||
echo "$l.utf-8 UTF-8"
|
||||
done
|
||||
for l in mk mk_MK ru ru_RU; do
|
||||
echo "$l ISO-8859-5"
|
||||
echo "$l.iso-8859-5 ISO-8859-5"
|
||||
echo "$l.koi8-r KOI8-R"
|
||||
echo "$l.cp-866 CP866"
|
||||
echo "$l.cp-1251 CP1251"
|
||||
echo "$l.utf-8 UTF-8"
|
||||
done
|
||||
for l in ar ar_SA; do
|
||||
echo "$l ISO-8859-6"
|
||||
echo "$l.iso-8859-6 ISO-8859-6"
|
||||
echo "$l.cp-864 CP864"
|
||||
#echo "$l.cp-868 CP868" # not a commonly used encoding
|
||||
echo "$l.cp-1256 CP1256"
|
||||
echo "$l.utf-8 UTF-8"
|
||||
done
|
||||
for l in el el_GR gr gr_GR; do
|
||||
echo "$l ISO-8859-7"
|
||||
echo "$l.iso-8859-7 ISO-8859-7"
|
||||
echo "$l.cp-869 CP869"
|
||||
echo "$l.cp-1253 CP1253"
|
||||
echo "$l.cp-1253@euro CP1253"
|
||||
echo "$l.utf-8 UTF-8"
|
||||
echo "$l.utf-8@euro UTF-8"
|
||||
done
|
||||
for l in he he_IL iw iw_IL; do
|
||||
echo "$l ISO-8859-8"
|
||||
echo "$l.iso-8859-8 ISO-8859-8"
|
||||
echo "$l.cp-862 CP862"
|
||||
echo "$l.cp-1255 CP1255"
|
||||
echo "$l.utf-8 UTF-8"
|
||||
done
|
||||
for l in tr tr_TR; do
|
||||
echo "$l ISO-8859-9"
|
||||
echo "$l.iso-8859-9 ISO-8859-9"
|
||||
echo "$l.cp-857 CP857"
|
||||
echo "$l.cp-1254 CP1254"
|
||||
echo "$l.utf-8 UTF-8"
|
||||
done
|
||||
for l in lt lt_LT lv lv_LV; do
|
||||
#echo "$l BALTIC" # not a commonly used encoding, wrong encoding name
|
||||
echo "$l ISO-8859-13"
|
||||
done
|
||||
for l in ru_UA uk uk_UA; do
|
||||
echo "$l KOI8-U"
|
||||
done
|
||||
for l in zh zh_CN; do
|
||||
#echo "$l GB_2312-80" # not a commonly used encoding, wrong encoding name
|
||||
echo "$l GB2312"
|
||||
done
|
||||
for l in ja ja_JP ja_JP.EUC; do
|
||||
echo "$l EUC-JP"
|
||||
done
|
||||
for l in ko ko_KR; do
|
||||
echo "$l EUC-KR"
|
||||
done
|
||||
for l in th th_TH; do
|
||||
echo "$l TIS-620"
|
||||
done
|
||||
for l in fa fa_IR; do
|
||||
#echo "$l ISIRI-3342" # a broken encoding
|
||||
echo "$l.utf-8 UTF-8"
|
||||
done
|
||||
;;
|
||||
linux* | *-gnu*)
|
||||
# With glibc-2.1 or newer, we don't need any canonicalization,
|
||||
# because glibc has iconv and both glibc and libiconv support all
|
||||
# GNU canonical names directly. Therefore, the Makefile does not
|
||||
# need to install the alias file at all.
|
||||
# The following applies only to glibc-2.0.x and older libcs.
|
||||
echo "ISO_646.IRV:1983 ASCII"
|
||||
;;
|
||||
aix*)
|
||||
echo "ISO8859-1 ISO-8859-1"
|
||||
echo "ISO8859-2 ISO-8859-2"
|
||||
echo "ISO8859-5 ISO-8859-5"
|
||||
echo "ISO8859-6 ISO-8859-6"
|
||||
echo "ISO8859-7 ISO-8859-7"
|
||||
echo "ISO8859-8 ISO-8859-8"
|
||||
echo "ISO8859-9 ISO-8859-9"
|
||||
echo "ISO8859-15 ISO-8859-15"
|
||||
echo "IBM-850 CP850"
|
||||
echo "IBM-856 CP856"
|
||||
echo "IBM-921 ISO-8859-13"
|
||||
echo "IBM-922 CP922"
|
||||
echo "IBM-932 CP932"
|
||||
echo "IBM-943 CP943"
|
||||
echo "IBM-1046 CP1046"
|
||||
echo "IBM-1124 CP1124"
|
||||
echo "IBM-1129 CP1129"
|
||||
echo "IBM-1252 CP1252"
|
||||
echo "IBM-eucCN GB2312"
|
||||
echo "IBM-eucJP EUC-JP"
|
||||
echo "IBM-eucKR EUC-KR"
|
||||
echo "IBM-eucTW EUC-TW"
|
||||
echo "big5 BIG5"
|
||||
echo "GBK GBK"
|
||||
echo "TIS-620 TIS-620"
|
||||
echo "UTF-8 UTF-8"
|
||||
;;
|
||||
hpux*)
|
||||
echo "iso88591 ISO-8859-1"
|
||||
echo "iso88592 ISO-8859-2"
|
||||
echo "iso88595 ISO-8859-5"
|
||||
echo "iso88596 ISO-8859-6"
|
||||
echo "iso88597 ISO-8859-7"
|
||||
echo "iso88598 ISO-8859-8"
|
||||
echo "iso88599 ISO-8859-9"
|
||||
echo "iso885915 ISO-8859-15"
|
||||
echo "roman8 HP-ROMAN8"
|
||||
echo "arabic8 HP-ARABIC8"
|
||||
echo "greek8 HP-GREEK8"
|
||||
echo "hebrew8 HP-HEBREW8"
|
||||
echo "turkish8 HP-TURKISH8"
|
||||
echo "kana8 HP-KANA8"
|
||||
echo "tis620 TIS-620"
|
||||
echo "big5 BIG5"
|
||||
echo "eucJP EUC-JP"
|
||||
echo "eucKR EUC-KR"
|
||||
echo "eucTW EUC-TW"
|
||||
echo "hp15CN GB2312"
|
||||
#echo "ccdc ?" # what is this?
|
||||
echo "SJIS SHIFT_JIS"
|
||||
echo "utf8 UTF-8"
|
||||
;;
|
||||
irix*)
|
||||
echo "ISO8859-1 ISO-8859-1"
|
||||
echo "ISO8859-2 ISO-8859-2"
|
||||
echo "ISO8859-5 ISO-8859-5"
|
||||
echo "ISO8859-7 ISO-8859-7"
|
||||
echo "ISO8859-9 ISO-8859-9"
|
||||
echo "eucCN GB2312"
|
||||
echo "eucJP EUC-JP"
|
||||
echo "eucKR EUC-KR"
|
||||
echo "eucTW EUC-TW"
|
||||
;;
|
||||
osf*)
|
||||
echo "ISO8859-1 ISO-8859-1"
|
||||
echo "ISO8859-2 ISO-8859-2"
|
||||
echo "ISO8859-4 ISO-8859-4"
|
||||
echo "ISO8859-5 ISO-8859-5"
|
||||
echo "ISO8859-7 ISO-8859-7"
|
||||
echo "ISO8859-8 ISO-8859-8"
|
||||
echo "ISO8859-9 ISO-8859-9"
|
||||
echo "ISO8859-15 ISO-8859-15"
|
||||
echo "cp850 CP850"
|
||||
echo "big5 BIG5"
|
||||
echo "dechanyu DEC-HANYU"
|
||||
echo "dechanzi GB2312"
|
||||
echo "deckanji DEC-KANJI"
|
||||
echo "deckorean EUC-KR"
|
||||
echo "eucJP EUC-JP"
|
||||
echo "eucKR EUC-KR"
|
||||
echo "eucTW EUC-TW"
|
||||
echo "GBK GBK"
|
||||
echo "KSC5601 CP949"
|
||||
echo "sdeckanji EUC-JP"
|
||||
echo "SJIS SHIFT_JIS"
|
||||
echo "TACTIS TIS-620"
|
||||
echo "UTF-8 UTF-8"
|
||||
;;
|
||||
solaris*)
|
||||
echo "646 ASCII"
|
||||
echo "ISO8859-1 ISO-8859-1"
|
||||
echo "ISO8859-2 ISO-8859-2"
|
||||
echo "ISO8859-3 ISO-8859-3"
|
||||
echo "ISO8859-4 ISO-8859-4"
|
||||
echo "ISO8859-5 ISO-8859-5"
|
||||
echo "ISO8859-6 ISO-8859-6"
|
||||
echo "ISO8859-7 ISO-8859-7"
|
||||
echo "ISO8859-8 ISO-8859-8"
|
||||
echo "ISO8859-9 ISO-8859-9"
|
||||
echo "ISO8859-15 ISO-8859-15"
|
||||
echo "koi8-r KOI8-R"
|
||||
echo "ansi-1251 CP1251"
|
||||
echo "BIG5 BIG5"
|
||||
echo "Big5-HKSCS BIG5-HKSCS"
|
||||
echo "gb2312 GB2312"
|
||||
echo "GBK GBK"
|
||||
echo "GB18030 GB18030"
|
||||
echo "cns11643 EUC-TW"
|
||||
echo "5601 EUC-KR"
|
||||
echo "ko_KR.johap92 JOHAB"
|
||||
echo "eucJP EUC-JP"
|
||||
echo "PCK SHIFT_JIS"
|
||||
echo "TIS620.2533 TIS-620"
|
||||
#echo "sun_eu_greek ?" # what is this?
|
||||
echo "UTF-8 UTF-8"
|
||||
;;
|
||||
freebsd* | os2*)
|
||||
# FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore
|
||||
# localcharset.c falls back to using the full locale name
|
||||
# from the environment variables.
|
||||
# Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just
|
||||
# reuse FreeBSD's locale data for OS/2.
|
||||
echo "C ASCII"
|
||||
echo "US-ASCII ASCII"
|
||||
for l in la_LN lt_LN; do
|
||||
echo "$l.ASCII ASCII"
|
||||
done
|
||||
for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \
|
||||
fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \
|
||||
lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do
|
||||
echo "$l.ISO_8859-1 ISO-8859-1"
|
||||
echo "$l.DIS_8859-15 ISO-8859-15"
|
||||
done
|
||||
for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do
|
||||
echo "$l.ISO_8859-2 ISO-8859-2"
|
||||
done
|
||||
for l in la_LN lt_LT; do
|
||||
echo "$l.ISO_8859-4 ISO-8859-4"
|
||||
done
|
||||
for l in ru_RU ru_SU; do
|
||||
echo "$l.KOI8-R KOI8-R"
|
||||
echo "$l.ISO_8859-5 ISO-8859-5"
|
||||
echo "$l.CP866 CP866"
|
||||
done
|
||||
echo "uk_UA.KOI8-U KOI8-U"
|
||||
echo "zh_TW.BIG5 BIG5"
|
||||
echo "zh_TW.Big5 BIG5"
|
||||
echo "zh_CN.EUC GB2312"
|
||||
echo "ja_JP.EUC EUC-JP"
|
||||
echo "ja_JP.SJIS SHIFT_JIS"
|
||||
echo "ja_JP.Shift_JIS SHIFT_JIS"
|
||||
echo "ko_KR.EUC EUC-KR"
|
||||
;;
|
||||
netbsd*)
|
||||
echo "646 ASCII"
|
||||
echo "ISO8859-1 ISO-8859-1"
|
||||
echo "ISO8859-2 ISO-8859-2"
|
||||
echo "ISO8859-4 ISO-8859-4"
|
||||
echo "ISO8859-5 ISO-8859-5"
|
||||
echo "ISO8859-7 ISO-8859-7"
|
||||
echo "ISO8859-13 ISO-8859-13"
|
||||
echo "ISO8859-15 ISO-8859-15"
|
||||
echo "eucCN GB2312"
|
||||
echo "eucJP EUC-JP"
|
||||
echo "eucKR EUC-KR"
|
||||
echo "eucTW EUC-TW"
|
||||
echo "BIG5 BIG5"
|
||||
echo "SJIS SHIFT_JIS"
|
||||
;;
|
||||
openbsd*)
|
||||
echo "646 ASCII"
|
||||
echo "ISO8859-1 ISO-8859-1"
|
||||
echo "ISO8859-2 ISO-8859-2"
|
||||
echo "ISO8859-4 ISO-8859-4"
|
||||
echo "ISO8859-5 ISO-8859-5"
|
||||
echo "ISO8859-7 ISO-8859-7"
|
||||
echo "ISO8859-13 ISO-8859-13"
|
||||
echo "ISO8859-15 ISO-8859-15"
|
||||
;;
|
||||
darwin[56]*)
|
||||
# Darwin 6.8 doesn't have nl_langinfo(CODESET); therefore
|
||||
# localcharset.c falls back to using the full locale name
|
||||
# from the environment variables.
|
||||
echo "C ASCII"
|
||||
for l in en_AU en_CA en_GB en_US la_LN; do
|
||||
echo "$l.US-ASCII ASCII"
|
||||
done
|
||||
for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \
|
||||
fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT nl_BE \
|
||||
nl_NL no_NO pt_PT sv_SE; do
|
||||
echo "$l ISO-8859-1"
|
||||
echo "$l.ISO8859-1 ISO-8859-1"
|
||||
echo "$l.ISO8859-15 ISO-8859-15"
|
||||
done
|
||||
for l in la_LN; do
|
||||
echo "$l.ISO8859-1 ISO-8859-1"
|
||||
echo "$l.ISO8859-15 ISO-8859-15"
|
||||
done
|
||||
for l in cs_CZ hr_HR hu_HU la_LN pl_PL sl_SI; do
|
||||
echo "$l.ISO8859-2 ISO-8859-2"
|
||||
done
|
||||
for l in la_LN lt_LT; do
|
||||
echo "$l.ISO8859-4 ISO-8859-4"
|
||||
done
|
||||
for l in ru_RU; do
|
||||
echo "$l.KOI8-R KOI8-R"
|
||||
echo "$l.ISO8859-5 ISO-8859-5"
|
||||
echo "$l.CP866 CP866"
|
||||
done
|
||||
for l in bg_BG; do
|
||||
echo "$l.CP1251 CP1251"
|
||||
done
|
||||
echo "uk_UA.KOI8-U KOI8-U"
|
||||
echo "zh_TW.BIG5 BIG5"
|
||||
echo "zh_TW.Big5 BIG5"
|
||||
echo "zh_CN.EUC GB2312"
|
||||
echo "ja_JP.EUC EUC-JP"
|
||||
echo "ja_JP.SJIS SHIFT_JIS"
|
||||
echo "ko_KR.EUC EUC-KR"
|
||||
;;
|
||||
darwin*)
|
||||
# Darwin 7.5 has nl_langinfo(CODESET), but sometimes its value is
|
||||
# useless:
|
||||
# - It returns the empty string when LANG is set to a locale of the
|
||||
# form ll_CC, although ll_CC/LC_CTYPE is a symlink to an UTF-8
|
||||
# LC_CTYPE file.
|
||||
# - The environment variables LANG, LC_CTYPE, LC_ALL are not set by
|
||||
# the system; nl_langinfo(CODESET) returns "US-ASCII" in this case.
|
||||
# - The documentation says:
|
||||
# "... all code that calls BSD system routines should ensure
|
||||
# that the const *char parameters of these routines are in UTF-8
|
||||
# encoding. All BSD system functions expect their string
|
||||
# parameters to be in UTF-8 encoding and nothing else."
|
||||
# It also says
|
||||
# "An additional caveat is that string parameters for files,
|
||||
# paths, and other file-system entities must be in canonical
|
||||
# UTF-8. In a canonical UTF-8 Unicode string, all decomposable
|
||||
# characters are decomposed ..."
|
||||
# but this is not true: You can pass non-decomposed UTF-8 strings
|
||||
# to file system functions, and it is the OS which will convert
|
||||
# them to decomposed UTF-8 before accessing the file system.
|
||||
# - The Apple Terminal application displays UTF-8 by default.
|
||||
# - However, other applications are free to use different encodings:
|
||||
# - xterm uses ISO-8859-1 by default.
|
||||
# - TextEdit uses MacRoman by default.
|
||||
# We prefer UTF-8 over decomposed UTF-8-MAC because one should
|
||||
# minimize the use of decomposed Unicode. Unfortunately, through the
|
||||
# Darwin file system, decomposed UTF-8 strings are leaked into user
|
||||
# space nevertheless.
|
||||
# Then there are also the locales with encodings other than US-ASCII
|
||||
# and UTF-8. These locales can be occasionally useful to users (e.g.
|
||||
# when grepping through ISO-8859-1 encoded text files), when all their
|
||||
# file names are in US-ASCII.
|
||||
echo "ISO8859-1 ISO-8859-1"
|
||||
echo "ISO8859-2 ISO-8859-2"
|
||||
echo "ISO8859-4 ISO-8859-4"
|
||||
echo "ISO8859-5 ISO-8859-5"
|
||||
echo "ISO8859-7 ISO-8859-7"
|
||||
echo "ISO8859-9 ISO-8859-9"
|
||||
echo "ISO8859-13 ISO-8859-13"
|
||||
echo "ISO8859-15 ISO-8859-15"
|
||||
echo "KOI8-R KOI8-R"
|
||||
echo "KOI8-U KOI8-U"
|
||||
echo "CP866 CP866"
|
||||
echo "CP949 CP949"
|
||||
echo "CP1131 CP1131"
|
||||
echo "CP1251 CP1251"
|
||||
echo "eucCN GB2312"
|
||||
echo "GB2312 GB2312"
|
||||
echo "eucJP EUC-JP"
|
||||
echo "eucKR EUC-KR"
|
||||
echo "Big5 BIG5"
|
||||
echo "Big5HKSCS BIG5-HKSCS"
|
||||
echo "GBK GBK"
|
||||
echo "GB18030 GB18030"
|
||||
echo "SJIS SHIFT_JIS"
|
||||
echo "ARMSCII-8 ARMSCII-8"
|
||||
echo "PT154 PT154"
|
||||
#echo "ISCII-DEV ?"
|
||||
echo "* UTF-8"
|
||||
;;
|
||||
beos* | haiku*)
|
||||
# BeOS and Haiku have a single locale, and it has UTF-8 encoding.
|
||||
echo "* UTF-8"
|
||||
;;
|
||||
msdosdjgpp*)
|
||||
# DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore
|
||||
# localcharset.c falls back to using the full locale name
|
||||
# from the environment variables.
|
||||
echo "#"
|
||||
echo "# The encodings given here may not all be correct."
|
||||
echo "# If you find that the encoding given for your language and"
|
||||
echo "# country is not the one your DOS machine actually uses, just"
|
||||
echo "# correct it in this file, and send a mail to"
|
||||
echo "# Juan Manuel Guerrero <juan.guerrero@gmx.de>"
|
||||
echo "# and Bruno Haible <bruno@clisp.org>."
|
||||
echo "#"
|
||||
echo "C ASCII"
|
||||
# ISO-8859-1 languages
|
||||
echo "ca CP850"
|
||||
echo "ca_ES CP850"
|
||||
echo "da CP865" # not CP850 ??
|
||||
echo "da_DK CP865" # not CP850 ??
|
||||
echo "de CP850"
|
||||
echo "de_AT CP850"
|
||||
echo "de_CH CP850"
|
||||
echo "de_DE CP850"
|
||||
echo "en CP850"
|
||||
echo "en_AU CP850" # not CP437 ??
|
||||
echo "en_CA CP850"
|
||||
echo "en_GB CP850"
|
||||
echo "en_NZ CP437"
|
||||
echo "en_US CP437"
|
||||
echo "en_ZA CP850" # not CP437 ??
|
||||
echo "es CP850"
|
||||
echo "es_AR CP850"
|
||||
echo "es_BO CP850"
|
||||
echo "es_CL CP850"
|
||||
echo "es_CO CP850"
|
||||
echo "es_CR CP850"
|
||||
echo "es_CU CP850"
|
||||
echo "es_DO CP850"
|
||||
echo "es_EC CP850"
|
||||
echo "es_ES CP850"
|
||||
echo "es_GT CP850"
|
||||
echo "es_HN CP850"
|
||||
echo "es_MX CP850"
|
||||
echo "es_NI CP850"
|
||||
echo "es_PA CP850"
|
||||
echo "es_PY CP850"
|
||||
echo "es_PE CP850"
|
||||
echo "es_SV CP850"
|
||||
echo "es_UY CP850"
|
||||
echo "es_VE CP850"
|
||||
echo "et CP850"
|
||||
echo "et_EE CP850"
|
||||
echo "eu CP850"
|
||||
echo "eu_ES CP850"
|
||||
echo "fi CP850"
|
||||
echo "fi_FI CP850"
|
||||
echo "fr CP850"
|
||||
echo "fr_BE CP850"
|
||||
echo "fr_CA CP850"
|
||||
echo "fr_CH CP850"
|
||||
echo "fr_FR CP850"
|
||||
echo "ga CP850"
|
||||
echo "ga_IE CP850"
|
||||
echo "gd CP850"
|
||||
echo "gd_GB CP850"
|
||||
echo "gl CP850"
|
||||
echo "gl_ES CP850"
|
||||
echo "id CP850" # not CP437 ??
|
||||
echo "id_ID CP850" # not CP437 ??
|
||||
echo "is CP861" # not CP850 ??
|
||||
echo "is_IS CP861" # not CP850 ??
|
||||
echo "it CP850"
|
||||
echo "it_CH CP850"
|
||||
echo "it_IT CP850"
|
||||
echo "lt CP775"
|
||||
echo "lt_LT CP775"
|
||||
echo "lv CP775"
|
||||
echo "lv_LV CP775"
|
||||
echo "nb CP865" # not CP850 ??
|
||||
echo "nb_NO CP865" # not CP850 ??
|
||||
echo "nl CP850"
|
||||
echo "nl_BE CP850"
|
||||
echo "nl_NL CP850"
|
||||
echo "nn CP865" # not CP850 ??
|
||||
echo "nn_NO CP865" # not CP850 ??
|
||||
echo "no CP865" # not CP850 ??
|
||||
echo "no_NO CP865" # not CP850 ??
|
||||
echo "pt CP850"
|
||||
echo "pt_BR CP850"
|
||||
echo "pt_PT CP850"
|
||||
echo "sv CP850"
|
||||
echo "sv_SE CP850"
|
||||
# ISO-8859-2 languages
|
||||
echo "cs CP852"
|
||||
echo "cs_CZ CP852"
|
||||
echo "hr CP852"
|
||||
echo "hr_HR CP852"
|
||||
echo "hu CP852"
|
||||
echo "hu_HU CP852"
|
||||
echo "pl CP852"
|
||||
echo "pl_PL CP852"
|
||||
echo "ro CP852"
|
||||
echo "ro_RO CP852"
|
||||
echo "sk CP852"
|
||||
echo "sk_SK CP852"
|
||||
echo "sl CP852"
|
||||
echo "sl_SI CP852"
|
||||
echo "sq CP852"
|
||||
echo "sq_AL CP852"
|
||||
echo "sr CP852" # CP852 or CP866 or CP855 ??
|
||||
echo "sr_CS CP852" # CP852 or CP866 or CP855 ??
|
||||
echo "sr_YU CP852" # CP852 or CP866 or CP855 ??
|
||||
# ISO-8859-3 languages
|
||||
echo "mt CP850"
|
||||
echo "mt_MT CP850"
|
||||
# ISO-8859-5 languages
|
||||
echo "be CP866"
|
||||
echo "be_BE CP866"
|
||||
echo "bg CP866" # not CP855 ??
|
||||
echo "bg_BG CP866" # not CP855 ??
|
||||
echo "mk CP866" # not CP855 ??
|
||||
echo "mk_MK CP866" # not CP855 ??
|
||||
echo "ru CP866"
|
||||
echo "ru_RU CP866"
|
||||
echo "uk CP1125"
|
||||
echo "uk_UA CP1125"
|
||||
# ISO-8859-6 languages
|
||||
echo "ar CP864"
|
||||
echo "ar_AE CP864"
|
||||
echo "ar_DZ CP864"
|
||||
echo "ar_EG CP864"
|
||||
echo "ar_IQ CP864"
|
||||
echo "ar_IR CP864"
|
||||
echo "ar_JO CP864"
|
||||
echo "ar_KW CP864"
|
||||
echo "ar_MA CP864"
|
||||
echo "ar_OM CP864"
|
||||
echo "ar_QA CP864"
|
||||
echo "ar_SA CP864"
|
||||
echo "ar_SY CP864"
|
||||
# ISO-8859-7 languages
|
||||
echo "el CP869"
|
||||
echo "el_GR CP869"
|
||||
# ISO-8859-8 languages
|
||||
echo "he CP862"
|
||||
echo "he_IL CP862"
|
||||
# ISO-8859-9 languages
|
||||
echo "tr CP857"
|
||||
echo "tr_TR CP857"
|
||||
# Japanese
|
||||
echo "ja CP932"
|
||||
echo "ja_JP CP932"
|
||||
# Chinese
|
||||
echo "zh_CN GBK"
|
||||
echo "zh_TW CP950" # not CP938 ??
|
||||
# Korean
|
||||
echo "kr CP949" # not CP934 ??
|
||||
echo "kr_KR CP949" # not CP934 ??
|
||||
# Thai
|
||||
echo "th CP874"
|
||||
echo "th_TH CP874"
|
||||
# Other
|
||||
echo "eo CP850"
|
||||
echo "eo_EO CP850"
|
||||
;;
|
||||
esac
|
|
@ -1,20 +1,20 @@
|
|||
/* dirname.c -- return all but the last element in a file name
|
||||
|
||||
Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2023 Free Software
|
||||
Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2013 Free Software
|
||||
Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
/* dirname.c -- return all but the last element in a file name
|
||||
|
||||
Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2023 Free Software
|
||||
Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2013 Free Software
|
||||
Foundation, Inc.
|
||||
|
||||
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
|
||||
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,
|
||||
|
@ -14,7 +14,7 @@
|
|||
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 <https://www.gnu.org/licenses/>. */
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
|
59
gl/dirname.h
59
gl/dirname.h
|
@ -1,53 +1,46 @@
|
|||
/* Take file names apart into directory and base names.
|
||||
/* Take file names apart into directory and base names.
|
||||
|
||||
Copyright (C) 1998, 2001, 2003-2006, 2009-2023 Free Software Foundation,
|
||||
Inc.
|
||||
Copyright (C) 1998, 2001, 2003-2006, 2009-2013 Free Software Foundation,
|
||||
Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file 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 Lesser General Public License for more details.
|
||||
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 Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef DIRNAME_H_
|
||||
# define DIRNAME_H_ 1
|
||||
|
||||
# include <stdlib.h>
|
||||
# include "filename.h"
|
||||
# include "basename-lgpl.h"
|
||||
# include <stdbool.h>
|
||||
# include <stddef.h>
|
||||
# include "dosname.h"
|
||||
|
||||
# ifndef DIRECTORY_SEPARATOR
|
||||
# define DIRECTORY_SEPARATOR '/'
|
||||
# endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
# if GNULIB_DIRNAME
|
||||
char *base_name (char const *file)
|
||||
_GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
|
||||
_GL_ATTRIBUTE_RETURNS_NONNULL;
|
||||
char *dir_name (char const *file)
|
||||
_GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
|
||||
_GL_ATTRIBUTE_RETURNS_NONNULL;
|
||||
# ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
|
||||
# define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
|
||||
# endif
|
||||
|
||||
char *mdir_name (char const *file)
|
||||
_GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
|
||||
# if GNULIB_DIRNAME
|
||||
char *base_name (char const *file);
|
||||
char *dir_name (char const *file);
|
||||
# endif
|
||||
|
||||
char *mdir_name (char const *file);
|
||||
size_t base_len (char const *file) _GL_ATTRIBUTE_PURE;
|
||||
size_t dir_len (char const *file) _GL_ATTRIBUTE_PURE;
|
||||
char *last_component (char const *file) _GL_ATTRIBUTE_PURE;
|
||||
|
||||
bool strip_trailing_slashes (char *file);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* not DIRNAME_H_ */
|
||||
|
|
53
gl/dosname.h
Normal file
53
gl/dosname.h
Normal file
|
@ -0,0 +1,53 @@
|
|||
/* File names on MS-DOS/Windows systems.
|
||||
|
||||
Copyright (C) 2000-2001, 2004-2006, 2009-2013 Free Software Foundation, Inc.
|
||||
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
From Paul Eggert and Jim Meyering. */
|
||||
|
||||
#ifndef _DOSNAME_H
|
||||
#define _DOSNAME_H
|
||||
|
||||
#if (defined _WIN32 || defined __WIN32__ || \
|
||||
defined __MSDOS__ || defined __CYGWIN__ || \
|
||||
defined __EMX__ || defined __DJGPP__)
|
||||
/* This internal macro assumes ASCII, but all hosts that support drive
|
||||
letters use ASCII. */
|
||||
# define _IS_DRIVE_LETTER(C) (((unsigned int) (C) | ('a' - 'A')) - 'a' \
|
||||
<= 'z' - 'a')
|
||||
# define FILE_SYSTEM_PREFIX_LEN(Filename) \
|
||||
(_IS_DRIVE_LETTER ((Filename)[0]) && (Filename)[1] == ':' ? 2 : 0)
|
||||
# ifndef __CYGWIN__
|
||||
# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 1
|
||||
# endif
|
||||
# define ISSLASH(C) ((C) == '/' || (C) == '\\')
|
||||
#else
|
||||
# define FILE_SYSTEM_PREFIX_LEN(Filename) 0
|
||||
# define ISSLASH(C) ((C) == '/')
|
||||
#endif
|
||||
|
||||
#ifndef FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
|
||||
# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0
|
||||
#endif
|
||||
|
||||
#if FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
|
||||
# define IS_ABSOLUTE_FILE_NAME(F) ISSLASH ((F)[FILE_SYSTEM_PREFIX_LEN (F)])
|
||||
# else
|
||||
# define IS_ABSOLUTE_FILE_NAME(F) \
|
||||
(ISSLASH ((F)[0]) || FILE_SYSTEM_PREFIX_LEN (F) != 0)
|
||||
#endif
|
||||
#define IS_RELATIVE_FILE_NAME(F) (! IS_ABSOLUTE_FILE_NAME (F))
|
||||
|
||||
#endif /* DOSNAME_H_ */
|
189
gl/dup2.c
189
gl/dup2.c
|
@ -1,189 +0,0 @@
|
|||
/* Duplicate an open file descriptor to a specified file descriptor.
|
||||
|
||||
Copyright (C) 1999, 2004-2007, 2009-2023 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* written by Paul Eggert */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include <unistd.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#undef dup2
|
||||
|
||||
#if defined _WIN32 && ! defined __CYGWIN__
|
||||
|
||||
/* Get declarations of the native Windows API functions. */
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
# include <windows.h>
|
||||
|
||||
# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
|
||||
# include "msvc-inval.h"
|
||||
# endif
|
||||
|
||||
/* Get _get_osfhandle. */
|
||||
# if GNULIB_MSVC_NOTHROW
|
||||
# include "msvc-nothrow.h"
|
||||
# else
|
||||
# include <io.h>
|
||||
# endif
|
||||
|
||||
# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
|
||||
static int
|
||||
dup2_nothrow (int fd, int desired_fd)
|
||||
{
|
||||
int result;
|
||||
|
||||
TRY_MSVC_INVAL
|
||||
{
|
||||
result = _dup2 (fd, desired_fd);
|
||||
}
|
||||
CATCH_MSVC_INVAL
|
||||
{
|
||||
errno = EBADF;
|
||||
result = -1;
|
||||
}
|
||||
DONE_MSVC_INVAL;
|
||||
|
||||
return result;
|
||||
}
|
||||
# else
|
||||
# define dup2_nothrow _dup2
|
||||
# endif
|
||||
|
||||
static int
|
||||
ms_windows_dup2 (int fd, int desired_fd)
|
||||
{
|
||||
int result;
|
||||
|
||||
/* If fd is closed, mingw hangs on dup2 (fd, fd). If fd is open,
|
||||
dup2 (fd, fd) returns 0, but all further attempts to use fd in
|
||||
future dup2 calls will hang. */
|
||||
if (fd == desired_fd)
|
||||
{
|
||||
if ((HANDLE) _get_osfhandle (fd) == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
errno = EBADF;
|
||||
return -1;
|
||||
}
|
||||
return fd;
|
||||
}
|
||||
|
||||
/* Wine 1.0.1 return 0 when desired_fd is negative but not -1:
|
||||
https://bugs.winehq.org/show_bug.cgi?id=21289 */
|
||||
if (desired_fd < 0)
|
||||
{
|
||||
errno = EBADF;
|
||||
return -1;
|
||||
}
|
||||
|
||||
result = dup2_nothrow (fd, desired_fd);
|
||||
|
||||
if (result == 0)
|
||||
result = desired_fd;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
# define dup2 ms_windows_dup2
|
||||
|
||||
#elif defined __KLIBC__
|
||||
|
||||
# include <InnoTekLIBC/backend.h>
|
||||
|
||||
static int
|
||||
klibc_dup2dirfd (int fd, int desired_fd)
|
||||
{
|
||||
int tempfd;
|
||||
int dupfd;
|
||||
|
||||
tempfd = open ("NUL", O_RDONLY);
|
||||
if (tempfd == -1)
|
||||
return -1;
|
||||
|
||||
if (tempfd == desired_fd)
|
||||
{
|
||||
close (tempfd);
|
||||
|
||||
char path[_MAX_PATH];
|
||||
if (__libc_Back_ioFHToPath (fd, path, sizeof (path)))
|
||||
return -1;
|
||||
|
||||
return open(path, O_RDONLY);
|
||||
}
|
||||
|
||||
dupfd = klibc_dup2dirfd (fd, desired_fd);
|
||||
|
||||
close (tempfd);
|
||||
|
||||
return dupfd;
|
||||
}
|
||||
|
||||
static int
|
||||
klibc_dup2 (int fd, int desired_fd)
|
||||
{
|
||||
int dupfd;
|
||||
struct stat sbuf;
|
||||
|
||||
dupfd = dup2 (fd, desired_fd);
|
||||
if (dupfd == -1 && errno == ENOTSUP \
|
||||
&& !fstat (fd, &sbuf) && S_ISDIR (sbuf.st_mode))
|
||||
{
|
||||
close (desired_fd);
|
||||
|
||||
return klibc_dup2dirfd (fd, desired_fd);
|
||||
}
|
||||
|
||||
return dupfd;
|
||||
}
|
||||
|
||||
# define dup2 klibc_dup2
|
||||
#endif
|
||||
|
||||
int
|
||||
rpl_dup2 (int fd, int desired_fd)
|
||||
{
|
||||
int result;
|
||||
|
||||
#ifdef F_GETFL
|
||||
/* On Linux kernels 2.6.26-2.6.29, dup2 (fd, fd) returns -EBADF.
|
||||
On Cygwin 1.5.x, dup2 (1, 1) returns 0.
|
||||
On Cygwin 1.7.17, dup2 (1, -1) dumps core.
|
||||
On Cygwin 1.7.25, dup2 (1, 256) can dump core.
|
||||
On Haiku, dup2 (fd, fd) mistakenly clears FD_CLOEXEC. */
|
||||
# if HAVE_SETDTABLESIZE
|
||||
setdtablesize (desired_fd + 1);
|
||||
# endif
|
||||
if (desired_fd < 0)
|
||||
fd = desired_fd;
|
||||
if (fd == desired_fd)
|
||||
return fcntl (fd, F_GETFL) == -1 ? -1 : fd;
|
||||
#endif
|
||||
|
||||
result = dup2 (fd, desired_fd);
|
||||
|
||||
/* Correct an errno value on FreeBSD 6.1 and Cygwin 1.5.x. */
|
||||
if (result == -1 && errno == EMFILE)
|
||||
errno = EBADF;
|
||||
#if REPLACE_FCHDIR
|
||||
if (fd != desired_fd && result != -1)
|
||||
result = _gl_register_dup (fd, result);
|
||||
#endif
|
||||
return result;
|
||||
}
|
284
gl/dynarray.h
284
gl/dynarray.h
|
@ -1,284 +0,0 @@
|
|||
/* Type-safe arrays which grow dynamically.
|
||||
Copyright 2021-2023 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Paul Eggert and Bruno Haible, 2021. */
|
||||
|
||||
#ifndef _GL_DYNARRAY_H
|
||||
#define _GL_DYNARRAY_H
|
||||
|
||||
/* Before including this file, you need to define:
|
||||
|
||||
DYNARRAY_STRUCT
|
||||
The struct tag of dynamic array to be defined.
|
||||
|
||||
DYNARRAY_ELEMENT
|
||||
The type name of the element type. Elements are copied
|
||||
as if by memcpy, and can change address as the dynamic
|
||||
array grows.
|
||||
|
||||
DYNARRAY_PREFIX
|
||||
The prefix of the functions which are defined.
|
||||
|
||||
The following parameters are optional:
|
||||
|
||||
DYNARRAY_ELEMENT_FREE
|
||||
DYNARRAY_ELEMENT_FREE (E) is evaluated to deallocate the
|
||||
contents of elements. E is of type DYNARRAY_ELEMENT *.
|
||||
|
||||
DYNARRAY_ELEMENT_INIT
|
||||
DYNARRAY_ELEMENT_INIT (E) is evaluated to initialize a new
|
||||
element. E is of type DYNARRAY_ELEMENT *.
|
||||
If DYNARRAY_ELEMENT_FREE but not DYNARRAY_ELEMENT_INIT is
|
||||
defined, new elements are automatically zero-initialized.
|
||||
Otherwise, new elements have undefined contents.
|
||||
|
||||
DYNARRAY_INITIAL_SIZE
|
||||
The size of the statically allocated array (default:
|
||||
at least 2, more elements if they fit into 128 bytes).
|
||||
Must be a preprocessor constant. If DYNARRAY_INITIAL_SIZE is 0,
|
||||
there is no statically allocated array at, and all non-empty
|
||||
arrays are heap-allocated.
|
||||
|
||||
DYNARRAY_FINAL_TYPE
|
||||
The name of the type which holds the final array. If not
|
||||
defined, is PREFIX##finalize not provided. DYNARRAY_FINAL_TYPE
|
||||
must be a struct type, with members of type DYNARRAY_ELEMENT and
|
||||
size_t at the start (in this order).
|
||||
|
||||
These macros are undefined after this header file has been
|
||||
included.
|
||||
|
||||
The following types are provided (their members are private to the
|
||||
dynarray implementation):
|
||||
|
||||
struct DYNARRAY_STRUCT
|
||||
|
||||
The following functions are provided:
|
||||
*/
|
||||
|
||||
/* Initialize a dynamic array object. This must be called before any
|
||||
use of the object. */
|
||||
#if 0
|
||||
static void
|
||||
DYNARRAY_PREFIX##init (struct DYNARRAY_STRUCT *list);
|
||||
#endif
|
||||
|
||||
/* Deallocate the dynamic array and its elements. */
|
||||
#if 0
|
||||
static void
|
||||
DYNARRAY_PREFIX##free (struct DYNARRAY_STRUCT *list);
|
||||
#endif
|
||||
|
||||
/* Return true if the dynamic array is in an error state. */
|
||||
#if 0
|
||||
static bool
|
||||
DYNARRAY_PREFIX##has_failed (const struct DYNARRAY_STRUCT *list);
|
||||
#endif
|
||||
|
||||
/* Mark the dynamic array as failed. All elements are deallocated as
|
||||
a side effect. */
|
||||
#if 0
|
||||
static void
|
||||
DYNARRAY_PREFIX##mark_failed (struct DYNARRAY_STRUCT *list);
|
||||
#endif
|
||||
|
||||
/* Return the number of elements which have been added to the dynamic
|
||||
array. */
|
||||
#if 0
|
||||
static size_t
|
||||
DYNARRAY_PREFIX##size (const struct DYNARRAY_STRUCT *list);
|
||||
#endif
|
||||
|
||||
/* Return a pointer to the first array element, if any. For a
|
||||
zero-length array, the pointer can be NULL even though the dynamic
|
||||
array has not entered the failure state. */
|
||||
#if 0
|
||||
static DYNARRAY_ELEMENT *
|
||||
DYNARRAY_PREFIX##begin (const struct DYNARRAY_STRUCT *list);
|
||||
#endif
|
||||
|
||||
/* Return a pointer one element past the last array element. For a
|
||||
zero-length array, the pointer can be NULL even though the dynamic
|
||||
array has not entered the failure state. */
|
||||
#if 0
|
||||
static DYNARRAY_ELEMENT *
|
||||
DYNARRAY_PREFIX##end (const struct DYNARRAY_STRUCT *list);
|
||||
#endif
|
||||
|
||||
/* Return a pointer to the array element at INDEX. Terminate the
|
||||
process if INDEX is out of bounds. */
|
||||
#if 0
|
||||
static DYNARRAY_ELEMENT *
|
||||
DYNARRAY_PREFIX##at (struct DYNARRAY_STRUCT *list, size_t index);
|
||||
#endif
|
||||
|
||||
/* Add ITEM at the end of the array, enlarging it by one element.
|
||||
Mark *LIST as failed if the dynamic array allocation size cannot be
|
||||
increased. */
|
||||
#if 0
|
||||
static void
|
||||
DYNARRAY_PREFIX##add (struct DYNARRAY_STRUCT *list,
|
||||
DYNARRAY_ELEMENT item);
|
||||
#endif
|
||||
|
||||
/* Allocate a place for a new element in *LIST and return a pointer to
|
||||
it. The pointer can be NULL if the dynamic array cannot be
|
||||
enlarged due to a memory allocation failure. */
|
||||
#if 0
|
||||
static DYNARRAY_ELEMENT *
|
||||
DYNARRAY_PREFIX##emplace (struct DYNARRAY_STRUCT *list);
|
||||
#endif
|
||||
|
||||
/* Change the size of *LIST to SIZE. If SIZE is larger than the
|
||||
existing size, new elements are added (which can be initialized).
|
||||
Otherwise, the list is truncated, and elements are freed. Return
|
||||
false on memory allocation failure (and mark *LIST as failed). */
|
||||
#if 0
|
||||
static bool
|
||||
DYNARRAY_PREFIX##resize (struct DYNARRAY_STRUCT *list, size_t size);
|
||||
#endif
|
||||
|
||||
/* Remove the last element of LIST if it is present. */
|
||||
#if 0
|
||||
static void
|
||||
DYNARRAY_PREFIX##remove_last (struct DYNARRAY_STRUCT *list);
|
||||
#endif
|
||||
|
||||
/* Remove all elements from the list. The elements are freed, but the
|
||||
list itself is not. */
|
||||
#if 0
|
||||
static void
|
||||
DYNARRAY_PREFIX##clear (struct DYNARRAY_STRUCT *list);
|
||||
#endif
|
||||
|
||||
#if defined DYNARRAY_FINAL_TYPE
|
||||
/* Transfer the dynamic array to a permanent location at *RESULT.
|
||||
Returns true on success on false on allocation failure. In either
|
||||
case, *LIST is re-initialized and can be reused. A NULL pointer is
|
||||
stored in *RESULT if LIST refers to an empty list. On success, the
|
||||
pointer in *RESULT is heap-allocated and must be deallocated using
|
||||
free. */
|
||||
#if 0
|
||||
static bool
|
||||
DYNARRAY_PREFIX##finalize (struct DYNARRAY_STRUCT *list,
|
||||
DYNARRAY_FINAL_TYPE *result);
|
||||
#endif
|
||||
#else /* !defined DYNARRAY_FINAL_TYPE */
|
||||
/* Transfer the dynamic array to a heap-allocated array and return a
|
||||
pointer to it. The pointer is NULL if memory allocation fails, or
|
||||
if the array is empty, so this function should be used only for
|
||||
arrays which are known not be empty (usually because they always
|
||||
have a sentinel at the end). If LENGTHP is not NULL, the array
|
||||
length is written to *LENGTHP. *LIST is re-initialized and can be
|
||||
reused. */
|
||||
#if 0
|
||||
static DYNARRAY_ELEMENT *
|
||||
DYNARRAY_PREFIX##finalize (struct DYNARRAY_STRUCT *list,
|
||||
size_t *lengthp);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* A minimal example which provides a growing list of integers can be
|
||||
defined like this:
|
||||
|
||||
struct int_array
|
||||
{
|
||||
// Pointer to result array followed by its length,
|
||||
// as required by DYNARRAY_FINAL_TYPE.
|
||||
int *array;
|
||||
size_t length;
|
||||
};
|
||||
|
||||
#define DYNARRAY_STRUCT dynarray_int
|
||||
#define DYNARRAY_ELEMENT int
|
||||
#define DYNARRAY_PREFIX dynarray_int_
|
||||
#define DYNARRAY_FINAL_TYPE struct int_array
|
||||
#include <malloc/dynarray-skeleton.c>
|
||||
|
||||
To create a three-element array with elements 1, 2, 3, use this
|
||||
code:
|
||||
|
||||
struct dynarray_int dyn;
|
||||
dynarray_int_init (&dyn);
|
||||
for (int i = 1; i <= 3; ++i)
|
||||
{
|
||||
int *place = dynarray_int_emplace (&dyn);
|
||||
assert (place != NULL);
|
||||
*place = i;
|
||||
}
|
||||
struct int_array result;
|
||||
bool ok = dynarray_int_finalize (&dyn, &result);
|
||||
assert (ok);
|
||||
assert (result.length == 3);
|
||||
assert (result.array[0] == 1);
|
||||
assert (result.array[1] == 2);
|
||||
assert (result.array[2] == 3);
|
||||
free (result.array);
|
||||
|
||||
If the elements contain resources which must be freed, define
|
||||
DYNARRAY_ELEMENT_FREE appropriately, like this:
|
||||
|
||||
struct str_array
|
||||
{
|
||||
char **array;
|
||||
size_t length;
|
||||
};
|
||||
|
||||
#define DYNARRAY_STRUCT dynarray_str
|
||||
#define DYNARRAY_ELEMENT char *
|
||||
#define DYNARRAY_ELEMENT_FREE(ptr) free (*ptr)
|
||||
#define DYNARRAY_PREFIX dynarray_str_
|
||||
#define DYNARRAY_FINAL_TYPE struct str_array
|
||||
#include <malloc/dynarray-skeleton.c>
|
||||
*/
|
||||
|
||||
|
||||
/* The implementation is imported from glibc. */
|
||||
|
||||
/* Avoid possible conflicts with symbols exported by the GNU libc. */
|
||||
#define __libc_dynarray_at_failure gl_dynarray_at_failure
|
||||
#define __libc_dynarray_emplace_enlarge gl_dynarray_emplace_enlarge
|
||||
#define __libc_dynarray_finalize gl_dynarray_finalize
|
||||
#define __libc_dynarray_resize_clear gl_dynarray_resize_clear
|
||||
#define __libc_dynarray_resize gl_dynarray_resize
|
||||
|
||||
#if defined DYNARRAY_STRUCT || defined DYNARRAY_ELEMENT || defined DYNARRAY_PREFIX
|
||||
|
||||
# ifndef _GL_LIKELY
|
||||
/* Rely on __builtin_expect, as provided by the module 'builtin-expect'. */
|
||||
# define _GL_LIKELY(cond) __builtin_expect ((cond), 1)
|
||||
# define _GL_UNLIKELY(cond) __builtin_expect ((cond), 0)
|
||||
# endif
|
||||
|
||||
/* Define auxiliary structs and declare auxiliary functions, common to all
|
||||
instantiations of dynarray. */
|
||||
# include <malloc/dynarray.gl.h>
|
||||
|
||||
/* Define the instantiation, specified through
|
||||
DYNARRAY_STRUCT
|
||||
DYNARRAY_ELEMENT
|
||||
DYNARRAY_PREFIX
|
||||
etc. */
|
||||
# include <malloc/dynarray-skeleton.gl.h>
|
||||
|
||||
#else
|
||||
|
||||
/* This file is being included from one of the malloc/dynarray_*.c files. */
|
||||
# include <malloc/dynarray.h>
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _GL_DYNARRAY_H */
|
|
@ -1,19 +1,19 @@
|
|||
/* A POSIX-like <errno.h>.
|
||||
|
||||
Copyright (C) 2008-2023 Free Software Foundation, Inc.
|
||||
Copyright (C) 2008-2013 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _@GUARD_PREFIX@_ERRNO_H
|
||||
|
||||
|
@ -30,7 +30,7 @@
|
|||
|
||||
|
||||
/* On native Windows platforms, many macros are not defined. */
|
||||
# if defined _WIN32 && ! defined __CYGWIN__
|
||||
# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
||||
|
||||
/* These are the same values as defined by MSVC 10, for interoperability. */
|
||||
|
||||
|
@ -248,7 +248,7 @@
|
|||
interoperability. */
|
||||
# define EOWNERDEAD 58
|
||||
# define ENOTRECOVERABLE 59
|
||||
# elif defined _WIN32 && ! defined __CYGWIN__
|
||||
# elif (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
||||
/* We have a conflict here: pthreads-win32 defines these values
|
||||
differently than MSVC 10. It's hairy to decide which one to use. */
|
||||
# if defined __MINGW32__ && !defined USE_WINDOWS_THREADS
|
||||
|
|
74
gl/error.c
74
gl/error.c
|
@ -1,19 +1,19 @@
|
|||
/* Error handler for noninteractive utilities
|
||||
Copyright (C) 1990-1998, 2000-2007, 2009-2023 Free Software Foundation, Inc.
|
||||
Copyright (C) 1990-1998, 2000-2007, 2009-2013 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */
|
||||
|
||||
|
@ -39,11 +39,6 @@
|
|||
# include <stdint.h>
|
||||
# include <wchar.h>
|
||||
# define mbsrtowcs __mbsrtowcs
|
||||
# define USE_UNLOCKED_IO 0
|
||||
# define _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD(a, b)
|
||||
# define _GL_ARG_NONNULL(a)
|
||||
#else
|
||||
# include "getprogname.h"
|
||||
#endif
|
||||
|
||||
#if USE_UNLOCKED_IO
|
||||
|
@ -77,14 +72,14 @@ extern void __error (int status, int errnum, const char *message, ...)
|
|||
extern void __error_at_line (int status, int errnum, const char *file_name,
|
||||
unsigned int line_number, const char *message,
|
||||
...)
|
||||
__attribute__ ((__format__ (__printf__, 5, 6)));
|
||||
__attribute__ ((__format__ (__printf__, 5, 6)));;
|
||||
# define error __error
|
||||
# define error_at_line __error_at_line
|
||||
|
||||
# include <libio/iolibio.h>
|
||||
# define fflush(s) _IO_fflush (s)
|
||||
# define fflush(s) INTUSE(_IO_fflush) (s)
|
||||
# undef putc
|
||||
# define putc(c, fp) _IO_putc (c, fp)
|
||||
# define putc(c, fp) INTUSE(_IO_putc) (c, fp)
|
||||
|
||||
# include <bits/libc-lock.h>
|
||||
|
||||
|
@ -93,37 +88,35 @@ extern void __error_at_line (int status, int errnum, const char *file_name,
|
|||
# include <fcntl.h>
|
||||
# include <unistd.h>
|
||||
|
||||
# if defined _WIN32 && ! defined __CYGWIN__
|
||||
# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
||||
/* Get declarations of the native Windows API functions. */
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
# include <windows.h>
|
||||
/* Get _get_osfhandle. */
|
||||
# if GNULIB_MSVC_NOTHROW
|
||||
# include "msvc-nothrow.h"
|
||||
# else
|
||||
# include <io.h>
|
||||
# endif
|
||||
# include "msvc-nothrow.h"
|
||||
# endif
|
||||
|
||||
/* The gnulib override of fcntl is not needed in this file. */
|
||||
# undef fcntl
|
||||
|
||||
# if !(GNULIB_STRERROR_R_POSIX || HAVE_DECL_STRERROR_R)
|
||||
# if !HAVE_DECL_STRERROR_R
|
||||
# ifndef HAVE_DECL_STRERROR_R
|
||||
"this configure-time declaration test was not run"
|
||||
# endif
|
||||
# if STRERROR_R_CHAR_P
|
||||
char *strerror_r (int errnum, char *buf, size_t buflen);
|
||||
char *strerror_r ();
|
||||
# else
|
||||
int strerror_r (int errnum, char *buf, size_t buflen);
|
||||
int strerror_r ();
|
||||
# endif
|
||||
# endif
|
||||
|
||||
# define program_name getprogname ()
|
||||
/* The calling program should define program_name and set it to the
|
||||
name of the executing program. */
|
||||
extern char *program_name;
|
||||
|
||||
# if GNULIB_STRERROR_R_POSIX || HAVE_STRERROR_R || defined strerror_r
|
||||
# if HAVE_STRERROR_R || defined strerror_r
|
||||
# define __strerror_r strerror_r
|
||||
# endif /* GNULIB_STRERROR_R_POSIX || HAVE_STRERROR_R || defined strerror_r */
|
||||
# endif /* HAVE_STRERROR_R || defined strerror_r */
|
||||
#endif /* not _LIBC */
|
||||
|
||||
#if !_LIBC
|
||||
|
@ -131,7 +124,7 @@ int strerror_r (int errnum, char *buf, size_t buflen);
|
|||
static int
|
||||
is_open (int fd)
|
||||
{
|
||||
# if defined _WIN32 && ! defined __CYGWIN__
|
||||
# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
||||
/* On native Windows: The initial state of unassigned standard file
|
||||
descriptors is that they are open but point to an INVALID_HANDLE_VALUE.
|
||||
There is no fcntl, and the gnulib replacement fcntl does not support
|
||||
|
@ -176,9 +169,9 @@ print_errno_message (int errnum)
|
|||
{
|
||||
char const *s;
|
||||
|
||||
#if _LIBC || GNULIB_STRERROR_R_POSIX || defined HAVE_STRERROR_R
|
||||
#if defined HAVE_STRERROR_R || _LIBC
|
||||
char errbuf[1024];
|
||||
# if _LIBC || (!GNULIB_STRERROR_R_POSIX && STRERROR_R_CHAR_P)
|
||||
# if STRERROR_R_CHAR_P || _LIBC
|
||||
s = __strerror_r (errnum, errbuf, sizeof errbuf);
|
||||
# else
|
||||
if (__strerror_r (errnum, errbuf, sizeof errbuf) == 0)
|
||||
|
@ -202,12 +195,13 @@ print_errno_message (int errnum)
|
|||
#endif
|
||||
}
|
||||
|
||||
static void _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 0) _GL_ARG_NONNULL ((3))
|
||||
static void
|
||||
error_tail (int status, int errnum, const char *message, va_list args)
|
||||
{
|
||||
#if _LIBC
|
||||
if (_IO_fwide (stderr, 0) > 0)
|
||||
{
|
||||
# define ALLOCA_LIMIT 2000
|
||||
size_t len = strlen (message) + 1;
|
||||
wchar_t *wmessage = NULL;
|
||||
mbstate_t st;
|
||||
|
@ -243,7 +237,7 @@ error_tail (int status, int errnum, const char *message, va_list args)
|
|||
if (res != len)
|
||||
break;
|
||||
|
||||
if (__builtin_expect (len >= SIZE_MAX / sizeof (wchar_t) / 2, 0))
|
||||
if (__builtin_expect (len >= SIZE_MAX / 2, 0))
|
||||
{
|
||||
/* This really should not happen if everything is fine. */
|
||||
res = (size_t) -1;
|
||||
|
@ -272,6 +266,7 @@ error_tail (int status, int errnum, const char *message, va_list args)
|
|||
else
|
||||
#endif
|
||||
vfprintf (stderr, message, args);
|
||||
va_end (args);
|
||||
|
||||
++error_message_count;
|
||||
if (errnum)
|
||||
|
@ -321,7 +316,6 @@ error (int status, int errnum, const char *message, ...)
|
|||
|
||||
va_start (args, message);
|
||||
error_tail (status, errnum, message, args);
|
||||
va_end (args);
|
||||
|
||||
#ifdef _LIBC
|
||||
_IO_funlockfile (stderr);
|
||||
|
@ -348,10 +342,7 @@ error_at_line (int status, int errnum, const char *file_name,
|
|||
|
||||
if (old_line_number == line_number
|
||||
&& (file_name == old_file_name
|
||||
|| (old_file_name != NULL
|
||||
&& file_name != NULL
|
||||
&& strcmp (old_file_name, file_name) == 0)))
|
||||
|
||||
|| strcmp (old_file_name, file_name) == 0))
|
||||
/* Simply return and print nothing. */
|
||||
return;
|
||||
|
||||
|
@ -383,16 +374,15 @@ error_at_line (int status, int errnum, const char *file_name,
|
|||
}
|
||||
|
||||
#if _LIBC
|
||||
__fxprintf (NULL, file_name != NULL ? "%s:%u: " : " ",
|
||||
__fxprintf (NULL, file_name != NULL ? "%s:%d: " : " ",
|
||||
file_name, line_number);
|
||||
#else
|
||||
fprintf (stderr, file_name != NULL ? "%s:%u: " : " ",
|
||||
fprintf (stderr, file_name != NULL ? "%s:%d: " : " ",
|
||||
file_name, line_number);
|
||||
#endif
|
||||
|
||||
va_start (args, message);
|
||||
error_tail (status, errnum, message, args);
|
||||
va_end (args);
|
||||
|
||||
#ifdef _LIBC
|
||||
_IO_funlockfile (stderr);
|
||||
|
|
45
gl/error.h
45
gl/error.h
|
@ -1,26 +1,35 @@
|
|||
/* Declaration for error-reporting function
|
||||
Copyright (C) 1995-1997, 2003, 2006, 2008-2023 Free Software Foundation,
|
||||
Copyright (C) 1995-1997, 2003, 2006, 2008-2013 Free Software Foundation,
|
||||
Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _ERROR_H
|
||||
#define _ERROR_H 1
|
||||
|
||||
/* Get _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM. */
|
||||
#include <stdio.h>
|
||||
/* The __attribute__ feature is available in gcc versions 2.5 and later.
|
||||
The __-protected variants of the attributes 'format' and 'printf' are
|
||||
accepted by gcc versions 2.6.4 (effectively 2.7) and later.
|
||||
We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
|
||||
gnulib and libintl do '#define printf __printf__' when they override
|
||||
the 'printf' function. */
|
||||
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
|
||||
# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
|
||||
#else
|
||||
# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
@ -31,21 +40,11 @@ extern "C" {
|
|||
If STATUS is nonzero, terminate the program with 'exit (STATUS)'. */
|
||||
|
||||
extern void error (int __status, int __errnum, const char *__format, ...)
|
||||
#if GNULIB_VFPRINTF_POSIX
|
||||
_GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 3, 4))
|
||||
#else
|
||||
_GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM, 3, 4))
|
||||
#endif
|
||||
;
|
||||
_GL_ATTRIBUTE_FORMAT ((__printf__, 3, 4));
|
||||
|
||||
extern void error_at_line (int __status, int __errnum, const char *__fname,
|
||||
unsigned int __lineno, const char *__format, ...)
|
||||
#if GNULIB_VFPRINTF_POSIX
|
||||
_GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 5, 6))
|
||||
#else
|
||||
_GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM, 5, 6))
|
||||
#endif
|
||||
;
|
||||
_GL_ATTRIBUTE_FORMAT ((__printf__, 5, 6));
|
||||
|
||||
/* If NULL, error will flush stdout, then print on stderr the program
|
||||
name, a colon and a space. Otherwise, error will call this
|
||||
|
|
|
@ -1,19 +1,19 @@
|
|||
/* Failure exit status
|
||||
|
||||
Copyright (C) 2002-2003, 2005-2007, 2009-2023 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002-2003, 2005-2007, 2009-2013 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
|
|
@ -1,18 +1,18 @@
|
|||
/* Failure exit status
|
||||
|
||||
Copyright (C) 2002, 2009-2023 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002, 2009-2013 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
extern int volatile exit_failure;
|
||||
|
|
629
gl/fcntl.c
629
gl/fcntl.c
|
@ -1,629 +0,0 @@
|
|||
/* Provide file descriptor control.
|
||||
|
||||
Copyright (C) 2009-2023 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Eric Blake <ebb9@byu.net>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include <fcntl.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifdef __KLIBC__
|
||||
# define INCL_DOS
|
||||
# include <os2.h>
|
||||
#endif
|
||||
|
||||
#if defined _WIN32 && ! defined __CYGWIN__
|
||||
/* Get declarations of the native Windows API functions. */
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
# include <windows.h>
|
||||
|
||||
/* Get _get_osfhandle. */
|
||||
# if GNULIB_MSVC_NOTHROW
|
||||
# include "msvc-nothrow.h"
|
||||
# else
|
||||
# include <io.h>
|
||||
# endif
|
||||
|
||||
/* Upper bound on getdtablesize(). See lib/getdtablesize.c. */
|
||||
# define OPEN_MAX_MAX 0x10000
|
||||
|
||||
/* Duplicate OLDFD into the first available slot of at least NEWFD,
|
||||
which must be positive, with FLAGS determining whether the duplicate
|
||||
will be inheritable. */
|
||||
static int
|
||||
dupfd (int oldfd, int newfd, int flags)
|
||||
{
|
||||
/* Mingw has no way to create an arbitrary fd. Iterate until all
|
||||
file descriptors less than newfd are filled up. */
|
||||
HANDLE curr_process = GetCurrentProcess ();
|
||||
HANDLE old_handle = (HANDLE) _get_osfhandle (oldfd);
|
||||
unsigned char fds_to_close[OPEN_MAX_MAX / CHAR_BIT];
|
||||
unsigned int fds_to_close_bound = 0;
|
||||
int result;
|
||||
BOOL inherit = flags & O_CLOEXEC ? FALSE : TRUE;
|
||||
int mode;
|
||||
|
||||
if (newfd < 0 || getdtablesize () <= newfd)
|
||||
{
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
if (old_handle == INVALID_HANDLE_VALUE
|
||||
|| (mode = _setmode (oldfd, O_BINARY)) == -1)
|
||||
{
|
||||
/* oldfd is not open, or is an unassigned standard file
|
||||
descriptor. */
|
||||
errno = EBADF;
|
||||
return -1;
|
||||
}
|
||||
_setmode (oldfd, mode);
|
||||
flags |= mode;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
HANDLE new_handle;
|
||||
int duplicated_fd;
|
||||
unsigned int index;
|
||||
|
||||
if (!DuplicateHandle (curr_process, /* SourceProcessHandle */
|
||||
old_handle, /* SourceHandle */
|
||||
curr_process, /* TargetProcessHandle */
|
||||
(PHANDLE) &new_handle, /* TargetHandle */
|
||||
(DWORD) 0, /* DesiredAccess */
|
||||
inherit, /* InheritHandle */
|
||||
DUPLICATE_SAME_ACCESS)) /* Options */
|
||||
{
|
||||
switch (GetLastError ())
|
||||
{
|
||||
case ERROR_TOO_MANY_OPEN_FILES:
|
||||
errno = EMFILE;
|
||||
break;
|
||||
case ERROR_INVALID_HANDLE:
|
||||
case ERROR_INVALID_TARGET_HANDLE:
|
||||
case ERROR_DIRECT_ACCESS_HANDLE:
|
||||
errno = EBADF;
|
||||
break;
|
||||
case ERROR_INVALID_PARAMETER:
|
||||
case ERROR_INVALID_FUNCTION:
|
||||
case ERROR_INVALID_ACCESS:
|
||||
errno = EINVAL;
|
||||
break;
|
||||
default:
|
||||
errno = EACCES;
|
||||
break;
|
||||
}
|
||||
result = -1;
|
||||
break;
|
||||
}
|
||||
duplicated_fd = _open_osfhandle ((intptr_t) new_handle, flags);
|
||||
if (duplicated_fd < 0)
|
||||
{
|
||||
CloseHandle (new_handle);
|
||||
result = -1;
|
||||
break;
|
||||
}
|
||||
if (newfd <= duplicated_fd)
|
||||
{
|
||||
result = duplicated_fd;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Set the bit duplicated_fd in fds_to_close[]. */
|
||||
index = (unsigned int) duplicated_fd / CHAR_BIT;
|
||||
if (fds_to_close_bound <= index)
|
||||
{
|
||||
if (sizeof fds_to_close <= index)
|
||||
/* Need to increase OPEN_MAX_MAX. */
|
||||
abort ();
|
||||
memset (fds_to_close + fds_to_close_bound, '\0',
|
||||
index + 1 - fds_to_close_bound);
|
||||
fds_to_close_bound = index + 1;
|
||||
}
|
||||
fds_to_close[index] |= 1 << ((unsigned int) duplicated_fd % CHAR_BIT);
|
||||
}
|
||||
|
||||
/* Close the previous fds that turned out to be too small. */
|
||||
{
|
||||
int saved_errno = errno;
|
||||
unsigned int duplicated_fd;
|
||||
|
||||
for (duplicated_fd = 0;
|
||||
duplicated_fd < fds_to_close_bound * CHAR_BIT;
|
||||
duplicated_fd++)
|
||||
if ((fds_to_close[duplicated_fd / CHAR_BIT]
|
||||
>> (duplicated_fd % CHAR_BIT))
|
||||
& 1)
|
||||
close (duplicated_fd);
|
||||
|
||||
errno = saved_errno;
|
||||
}
|
||||
|
||||
# if REPLACE_FCHDIR
|
||||
if (0 <= result)
|
||||
result = _gl_register_dup (oldfd, result);
|
||||
# endif
|
||||
return result;
|
||||
}
|
||||
#endif /* W32 */
|
||||
|
||||
/* Forward declarations, because we '#undef fcntl' in the middle of this
|
||||
compilation unit. */
|
||||
/* Our implementation of fcntl (fd, F_DUPFD, target). */
|
||||
static int rpl_fcntl_DUPFD (int fd, int target);
|
||||
/* Our implementation of fcntl (fd, F_DUPFD_CLOEXEC, target). */
|
||||
static int rpl_fcntl_DUPFD_CLOEXEC (int fd, int target);
|
||||
#ifdef __KLIBC__
|
||||
/* Adds support for fcntl on directories. */
|
||||
static int klibc_fcntl (int fd, int action, /* arg */...);
|
||||
#endif
|
||||
|
||||
|
||||
/* Perform the specified ACTION on the file descriptor FD, possibly
|
||||
using the argument ARG further described below. This replacement
|
||||
handles the following actions, and forwards all others on to the
|
||||
native fcntl. An unrecognized ACTION returns -1 with errno set to
|
||||
EINVAL.
|
||||
|
||||
F_DUPFD - duplicate FD, with int ARG being the minimum target fd.
|
||||
If successful, return the duplicate, which will be inheritable;
|
||||
otherwise return -1 and set errno.
|
||||
|
||||
F_DUPFD_CLOEXEC - duplicate FD, with int ARG being the minimum
|
||||
target fd. If successful, return the duplicate, which will not be
|
||||
inheritable; otherwise return -1 and set errno.
|
||||
|
||||
F_GETFD - ARG need not be present. If successful, return a
|
||||
non-negative value containing the descriptor flags of FD (only
|
||||
FD_CLOEXEC is portable, but other flags may be present); otherwise
|
||||
return -1 and set errno. */
|
||||
|
||||
int
|
||||
fcntl (int fd, int action, /* arg */...)
|
||||
#undef fcntl
|
||||
#ifdef __KLIBC__
|
||||
# define fcntl klibc_fcntl
|
||||
#endif
|
||||
{
|
||||
va_list arg;
|
||||
int result = -1;
|
||||
va_start (arg, action);
|
||||
switch (action)
|
||||
{
|
||||
case F_DUPFD:
|
||||
{
|
||||
int target = va_arg (arg, int);
|
||||
result = rpl_fcntl_DUPFD (fd, target);
|
||||
break;
|
||||
}
|
||||
|
||||
case F_DUPFD_CLOEXEC:
|
||||
{
|
||||
int target = va_arg (arg, int);
|
||||
result = rpl_fcntl_DUPFD_CLOEXEC (fd, target);
|
||||
break;
|
||||
}
|
||||
|
||||
#if !HAVE_FCNTL
|
||||
case F_GETFD:
|
||||
{
|
||||
# if defined _WIN32 && ! defined __CYGWIN__
|
||||
HANDLE handle = (HANDLE) _get_osfhandle (fd);
|
||||
DWORD flags;
|
||||
if (handle == INVALID_HANDLE_VALUE
|
||||
|| GetHandleInformation (handle, &flags) == 0)
|
||||
errno = EBADF;
|
||||
else
|
||||
result = (flags & HANDLE_FLAG_INHERIT) ? 0 : FD_CLOEXEC;
|
||||
# else /* !W32 */
|
||||
/* Use dup2 to reject invalid file descriptors. No way to
|
||||
access this information, so punt. */
|
||||
if (0 <= dup2 (fd, fd))
|
||||
result = 0;
|
||||
# endif /* !W32 */
|
||||
break;
|
||||
} /* F_GETFD */
|
||||
#endif /* !HAVE_FCNTL */
|
||||
|
||||
/* Implementing F_SETFD on mingw is not trivial - there is no
|
||||
API for changing the O_NOINHERIT bit on an fd, and merely
|
||||
changing the HANDLE_FLAG_INHERIT bit on the underlying handle
|
||||
can lead to odd state. It may be possible by duplicating the
|
||||
handle, using _open_osfhandle with the right flags, then
|
||||
using dup2 to move the duplicate onto the original, but that
|
||||
is not supported for now. */
|
||||
|
||||
default:
|
||||
{
|
||||
#if HAVE_FCNTL
|
||||
switch (action)
|
||||
{
|
||||
#ifdef F_BARRIERFSYNC /* macOS */
|
||||
case F_BARRIERFSYNC:
|
||||
#endif
|
||||
#ifdef F_CHKCLEAN /* macOS */
|
||||
case F_CHKCLEAN:
|
||||
#endif
|
||||
#ifdef F_CLOSEM /* NetBSD, HP-UX */
|
||||
case F_CLOSEM:
|
||||
#endif
|
||||
#ifdef F_FLUSH_DATA /* macOS */
|
||||
case F_FLUSH_DATA:
|
||||
#endif
|
||||
#ifdef F_FREEZE_FS /* macOS */
|
||||
case F_FREEZE_FS:
|
||||
#endif
|
||||
#ifdef F_FULLFSYNC /* macOS */
|
||||
case F_FULLFSYNC:
|
||||
#endif
|
||||
#ifdef F_GETCONFINED /* macOS */
|
||||
case F_GETCONFINED:
|
||||
#endif
|
||||
#ifdef F_GETDEFAULTPROTLEVEL /* macOS */
|
||||
case F_GETDEFAULTPROTLEVEL:
|
||||
#endif
|
||||
#ifdef F_GETFD /* POSIX */
|
||||
case F_GETFD:
|
||||
#endif
|
||||
#ifdef F_GETFL /* POSIX */
|
||||
case F_GETFL:
|
||||
#endif
|
||||
#ifdef F_GETLEASE /* Linux */
|
||||
case F_GETLEASE:
|
||||
#endif
|
||||
#ifdef F_GETNOSIGPIPE /* macOS */
|
||||
case F_GETNOSIGPIPE:
|
||||
#endif
|
||||
#ifdef F_GETOWN /* POSIX */
|
||||
case F_GETOWN:
|
||||
#endif
|
||||
#ifdef F_GETPIPE_SZ /* Linux */
|
||||
case F_GETPIPE_SZ:
|
||||
#endif
|
||||
#ifdef F_GETPROTECTIONCLASS /* macOS */
|
||||
case F_GETPROTECTIONCLASS:
|
||||
#endif
|
||||
#ifdef F_GETPROTECTIONLEVEL /* macOS */
|
||||
case F_GETPROTECTIONLEVEL:
|
||||
#endif
|
||||
#ifdef F_GET_SEALS /* Linux */
|
||||
case F_GET_SEALS:
|
||||
#endif
|
||||
#ifdef F_GETSIG /* Linux */
|
||||
case F_GETSIG:
|
||||
#endif
|
||||
#ifdef F_MAXFD /* NetBSD */
|
||||
case F_MAXFD:
|
||||
#endif
|
||||
#ifdef F_RECYCLE /* macOS */
|
||||
case F_RECYCLE:
|
||||
#endif
|
||||
#ifdef F_SETFIFOENH /* HP-UX */
|
||||
case F_SETFIFOENH:
|
||||
#endif
|
||||
#ifdef F_THAW_FS /* macOS */
|
||||
case F_THAW_FS:
|
||||
#endif
|
||||
/* These actions take no argument. */
|
||||
result = fcntl (fd, action);
|
||||
break;
|
||||
|
||||
#ifdef F_ADD_SEALS /* Linux */
|
||||
case F_ADD_SEALS:
|
||||
#endif
|
||||
#ifdef F_BADFD /* Solaris */
|
||||
case F_BADFD:
|
||||
#endif
|
||||
#ifdef F_CHECK_OPENEVT /* macOS */
|
||||
case F_CHECK_OPENEVT:
|
||||
#endif
|
||||
#ifdef F_DUP2FD /* FreeBSD, AIX, Solaris */
|
||||
case F_DUP2FD:
|
||||
#endif
|
||||
#ifdef F_DUP2FD_CLOEXEC /* FreeBSD, Solaris */
|
||||
case F_DUP2FD_CLOEXEC:
|
||||
#endif
|
||||
#ifdef F_DUP2FD_CLOFORK /* Solaris */
|
||||
case F_DUP2FD_CLOFORK:
|
||||
#endif
|
||||
#ifdef F_DUPFD /* POSIX */
|
||||
case F_DUPFD:
|
||||
#endif
|
||||
#ifdef F_DUPFD_CLOEXEC /* POSIX */
|
||||
case F_DUPFD_CLOEXEC:
|
||||
#endif
|
||||
#ifdef F_DUPFD_CLOFORK /* Solaris */
|
||||
case F_DUPFD_CLOFORK:
|
||||
#endif
|
||||
#ifdef F_GETXFL /* Solaris */
|
||||
case F_GETXFL:
|
||||
#endif
|
||||
#ifdef F_GLOBAL_NOCACHE /* macOS */
|
||||
case F_GLOBAL_NOCACHE:
|
||||
#endif
|
||||
#ifdef F_MAKECOMPRESSED /* macOS */
|
||||
case F_MAKECOMPRESSED:
|
||||
#endif
|
||||
#ifdef F_MOVEDATAEXTENTS /* macOS */
|
||||
case F_MOVEDATAEXTENTS:
|
||||
#endif
|
||||
#ifdef F_NOCACHE /* macOS */
|
||||
case F_NOCACHE:
|
||||
#endif
|
||||
#ifdef F_NODIRECT /* macOS */
|
||||
case F_NODIRECT:
|
||||
#endif
|
||||
#ifdef F_NOTIFY /* Linux */
|
||||
case F_NOTIFY:
|
||||
#endif
|
||||
#ifdef F_OPLKACK /* IRIX */
|
||||
case F_OPLKACK:
|
||||
#endif
|
||||
#ifdef F_OPLKREG /* IRIX */
|
||||
case F_OPLKREG:
|
||||
#endif
|
||||
#ifdef F_RDAHEAD /* macOS */
|
||||
case F_RDAHEAD:
|
||||
#endif
|
||||
#ifdef F_SETBACKINGSTORE /* macOS */
|
||||
case F_SETBACKINGSTORE:
|
||||
#endif
|
||||
#ifdef F_SETCONFINED /* macOS */
|
||||
case F_SETCONFINED:
|
||||
#endif
|
||||
#ifdef F_SETFD /* POSIX */
|
||||
case F_SETFD:
|
||||
#endif
|
||||
#ifdef F_SETFL /* POSIX */
|
||||
case F_SETFL:
|
||||
#endif
|
||||
#ifdef F_SETLEASE /* Linux */
|
||||
case F_SETLEASE:
|
||||
#endif
|
||||
#ifdef F_SETNOSIGPIPE /* macOS */
|
||||
case F_SETNOSIGPIPE:
|
||||
#endif
|
||||
#ifdef F_SETOWN /* POSIX */
|
||||
case F_SETOWN:
|
||||
#endif
|
||||
#ifdef F_SETPIPE_SZ /* Linux */
|
||||
case F_SETPIPE_SZ:
|
||||
#endif
|
||||
#ifdef F_SETPROTECTIONCLASS /* macOS */
|
||||
case F_SETPROTECTIONCLASS:
|
||||
#endif
|
||||
#ifdef F_SETSIG /* Linux */
|
||||
case F_SETSIG:
|
||||
#endif
|
||||
#ifdef F_SINGLE_WRITER /* macOS */
|
||||
case F_SINGLE_WRITER:
|
||||
#endif
|
||||
/* These actions take an 'int' argument. */
|
||||
{
|
||||
int x = va_arg (arg, int);
|
||||
result = fcntl (fd, action, x);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Other actions take a pointer argument. */
|
||||
{
|
||||
void *p = va_arg (arg, void *);
|
||||
result = fcntl (fd, action, p);
|
||||
}
|
||||
break;
|
||||
}
|
||||
#else
|
||||
errno = EINVAL;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
va_end (arg);
|
||||
return result;
|
||||
}
|
||||
|
||||
static int
|
||||
rpl_fcntl_DUPFD (int fd, int target)
|
||||
{
|
||||
int result;
|
||||
#if !HAVE_FCNTL
|
||||
result = dupfd (fd, target, 0);
|
||||
#elif FCNTL_DUPFD_BUGGY || REPLACE_FCHDIR
|
||||
/* Detect invalid target; needed for cygwin 1.5.x. */
|
||||
if (target < 0 || getdtablesize () <= target)
|
||||
{
|
||||
result = -1;
|
||||
errno = EINVAL;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Haiku alpha 2 loses fd flags on original. */
|
||||
int flags = fcntl (fd, F_GETFD);
|
||||
if (flags < 0)
|
||||
result = -1;
|
||||
else
|
||||
{
|
||||
result = fcntl (fd, F_DUPFD, target);
|
||||
if (0 <= result && fcntl (fd, F_SETFD, flags) == -1)
|
||||
{
|
||||
int saved_errno = errno;
|
||||
close (result);
|
||||
result = -1;
|
||||
errno = saved_errno;
|
||||
}
|
||||
# if REPLACE_FCHDIR
|
||||
if (0 <= result)
|
||||
result = _gl_register_dup (fd, result);
|
||||
# endif
|
||||
}
|
||||
}
|
||||
#else
|
||||
result = fcntl (fd, F_DUPFD, target);
|
||||
#endif
|
||||
return result;
|
||||
}
|
||||
|
||||
static int
|
||||
rpl_fcntl_DUPFD_CLOEXEC (int fd, int target)
|
||||
{
|
||||
int result;
|
||||
#if !HAVE_FCNTL
|
||||
result = dupfd (fd, target, O_CLOEXEC);
|
||||
#else /* HAVE_FCNTL */
|
||||
# if defined __NetBSD__ || defined __HAIKU__
|
||||
/* On NetBSD 9.0, the system fcntl (fd, F_DUPFD_CLOEXEC, target)
|
||||
has only the same effect as fcntl (fd, F_DUPFD, target). */
|
||||
/* On Haiku, the system fcntl (fd, F_DUPFD_CLOEXEC, target) sets
|
||||
the FD_CLOEXEC flag on fd, not on target. Therefore avoid the
|
||||
system fcntl in this case. */
|
||||
# define have_dupfd_cloexec -1
|
||||
# else
|
||||
/* Try the system call first, if the headers claim it exists
|
||||
(that is, if GNULIB_defined_F_DUPFD_CLOEXEC is 0), since we
|
||||
may be running with a glibc that has the macro but with an
|
||||
older kernel that does not support it. Cache the
|
||||
information on whether the system call really works, but
|
||||
avoid caching failure if the corresponding F_DUPFD fails
|
||||
for any reason. 0 = unknown, 1 = yes, -1 = no. */
|
||||
static int have_dupfd_cloexec = GNULIB_defined_F_DUPFD_CLOEXEC ? -1 : 0;
|
||||
if (0 <= have_dupfd_cloexec)
|
||||
{
|
||||
result = fcntl (fd, F_DUPFD_CLOEXEC, target);
|
||||
if (0 <= result || errno != EINVAL)
|
||||
{
|
||||
have_dupfd_cloexec = 1;
|
||||
# if REPLACE_FCHDIR
|
||||
if (0 <= result)
|
||||
result = _gl_register_dup (fd, result);
|
||||
# endif
|
||||
}
|
||||
else
|
||||
{
|
||||
result = rpl_fcntl_DUPFD (fd, target);
|
||||
if (result >= 0)
|
||||
have_dupfd_cloexec = -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
# endif
|
||||
result = rpl_fcntl_DUPFD (fd, target);
|
||||
if (0 <= result && have_dupfd_cloexec == -1)
|
||||
{
|
||||
int flags = fcntl (result, F_GETFD);
|
||||
if (flags < 0 || fcntl (result, F_SETFD, flags | FD_CLOEXEC) == -1)
|
||||
{
|
||||
int saved_errno = errno;
|
||||
close (result);
|
||||
errno = saved_errno;
|
||||
result = -1;
|
||||
}
|
||||
}
|
||||
#endif /* HAVE_FCNTL */
|
||||
return result;
|
||||
}
|
||||
|
||||
#undef fcntl
|
||||
|
||||
#ifdef __KLIBC__
|
||||
|
||||
static int
|
||||
klibc_fcntl (int fd, int action, /* arg */...)
|
||||
{
|
||||
va_list arg_ptr;
|
||||
int arg;
|
||||
struct stat sbuf;
|
||||
int result;
|
||||
|
||||
va_start (arg_ptr, action);
|
||||
arg = va_arg (arg_ptr, int);
|
||||
result = fcntl (fd, action, arg);
|
||||
/* EPERM for F_DUPFD, ENOTSUP for others */
|
||||
if (result == -1 && (errno == EPERM || errno == ENOTSUP)
|
||||
&& !fstat (fd, &sbuf) && S_ISDIR (sbuf.st_mode))
|
||||
{
|
||||
ULONG ulMode;
|
||||
|
||||
switch (action)
|
||||
{
|
||||
case F_DUPFD:
|
||||
/* Find available fd */
|
||||
while (fcntl (arg, F_GETFL) != -1 || errno != EBADF)
|
||||
arg++;
|
||||
|
||||
result = dup2 (fd, arg);
|
||||
break;
|
||||
|
||||
/* Using underlying APIs is right ? */
|
||||
case F_GETFD:
|
||||
if (DosQueryFHState (fd, &ulMode))
|
||||
break;
|
||||
|
||||
result = (ulMode & OPEN_FLAGS_NOINHERIT) ? FD_CLOEXEC : 0;
|
||||
break;
|
||||
|
||||
case F_SETFD:
|
||||
if (arg & ~FD_CLOEXEC)
|
||||
break;
|
||||
|
||||
if (DosQueryFHState (fd, &ulMode))
|
||||
break;
|
||||
|
||||
if (arg & FD_CLOEXEC)
|
||||
ulMode |= OPEN_FLAGS_NOINHERIT;
|
||||
else
|
||||
ulMode &= ~OPEN_FLAGS_NOINHERIT;
|
||||
|
||||
/* Filter supported flags. */
|
||||
ulMode &= (OPEN_FLAGS_WRITE_THROUGH | OPEN_FLAGS_FAIL_ON_ERROR
|
||||
| OPEN_FLAGS_NO_CACHE | OPEN_FLAGS_NOINHERIT);
|
||||
|
||||
if (DosSetFHState (fd, ulMode))
|
||||
break;
|
||||
|
||||
result = 0;
|
||||
break;
|
||||
|
||||
case F_GETFL:
|
||||
result = 0;
|
||||
break;
|
||||
|
||||
case F_SETFL:
|
||||
if (arg != 0)
|
||||
break;
|
||||
|
||||
result = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
errno = EINVAL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
va_end (arg_ptr);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif
|
445
gl/fcntl.in.h
445
gl/fcntl.in.h
|
@ -1,445 +0,0 @@
|
|||
/* Like <fcntl.h>, but with non-working flags defined to 0.
|
||||
|
||||
Copyright (C) 2006-2023 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* written by Paul Eggert */
|
||||
|
||||
#if __GNUC__ >= 3
|
||||
@PRAGMA_SYSTEM_HEADER@
|
||||
#endif
|
||||
@PRAGMA_COLUMNS@
|
||||
|
||||
#if defined __need_system_fcntl_h
|
||||
/* Special invocation convention. */
|
||||
|
||||
/* Needed before <sys/stat.h>.
|
||||
May also define off_t to a 64-bit type on native Windows. */
|
||||
#include <sys/types.h>
|
||||
/* On some systems other than glibc, <sys/stat.h> is a prerequisite of
|
||||
<fcntl.h>. On glibc systems, we would like to avoid namespace pollution.
|
||||
But on glibc systems, <fcntl.h> includes <sys/stat.h> inside an
|
||||
extern "C" { ... } block, which leads to errors in C++ mode with the
|
||||
overridden <sys/stat.h> from gnulib. These errors are known to be gone
|
||||
with g++ version >= 4.3. */
|
||||
#if !(defined __GLIBC__ || defined __UCLIBC__) || (defined __cplusplus && defined GNULIB_NAMESPACE && (defined __ICC || !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))))
|
||||
# include <sys/stat.h>
|
||||
#endif
|
||||
#@INCLUDE_NEXT@ @NEXT_FCNTL_H@
|
||||
|
||||
/* Native Windows platforms declare open(), creat() in <io.h>. */
|
||||
#if (@GNULIB_CREAT@ || @GNULIB_OPEN@ || defined GNULIB_POSIXCHECK) \
|
||||
&& (defined _WIN32 && ! defined __CYGWIN__)
|
||||
# include <io.h>
|
||||
#endif
|
||||
|
||||
#else
|
||||
/* Normal invocation convention. */
|
||||
|
||||
#ifndef _@GUARD_PREFIX@_FCNTL_H
|
||||
|
||||
/* Needed before <sys/stat.h>.
|
||||
May also define off_t to a 64-bit type on native Windows. */
|
||||
#include <sys/types.h>
|
||||
/* On some systems other than glibc, <sys/stat.h> is a prerequisite of
|
||||
<fcntl.h>. On glibc systems, we would like to avoid namespace pollution.
|
||||
But on glibc systems, <fcntl.h> includes <sys/stat.h> inside an
|
||||
extern "C" { ... } block, which leads to errors in C++ mode with the
|
||||
overridden <sys/stat.h> from gnulib. These errors are known to be gone
|
||||
with g++ version >= 4.3. */
|
||||
#if !(defined __GLIBC__ || defined __UCLIBC__) || (defined __cplusplus && defined GNULIB_NAMESPACE && (defined __ICC || !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))))
|
||||
# include <sys/stat.h>
|
||||
#endif
|
||||
/* The include_next requires a split double-inclusion guard. */
|
||||
#@INCLUDE_NEXT@ @NEXT_FCNTL_H@
|
||||
|
||||
/* Native Windows platforms declare open(), creat() in <io.h>. */
|
||||
#if (@GNULIB_CREAT@ || @GNULIB_OPEN@ || defined GNULIB_POSIXCHECK) \
|
||||
&& (defined _WIN32 && ! defined __CYGWIN__)
|
||||
# include <io.h>
|
||||
#endif
|
||||
|
||||
#ifndef _@GUARD_PREFIX@_FCNTL_H
|
||||
#define _@GUARD_PREFIX@_FCNTL_H
|
||||
|
||||
#ifndef __GLIBC__ /* Avoid namespace pollution on glibc systems. */
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
|
||||
|
||||
/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
|
||||
|
||||
/* The definition of _GL_ARG_NONNULL is copied here. */
|
||||
|
||||
/* The definition of _GL_WARN_ON_USE is copied here. */
|
||||
|
||||
|
||||
/* Declare overridden functions. */
|
||||
|
||||
#if @GNULIB_CREAT@
|
||||
# if @REPLACE_CREAT@
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# undef creat
|
||||
# define creat rpl_creat
|
||||
# endif
|
||||
_GL_FUNCDECL_RPL (creat, int, (const char *filename, mode_t mode)
|
||||
_GL_ARG_NONNULL ((1)));
|
||||
_GL_CXXALIAS_RPL (creat, int, (const char *filename, mode_t mode));
|
||||
# elif defined _WIN32 && !defined __CYGWIN__
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# undef creat
|
||||
# define creat _creat
|
||||
# endif
|
||||
_GL_CXXALIAS_MDA (creat, int, (const char *filename, mode_t mode));
|
||||
# else
|
||||
_GL_CXXALIAS_SYS (creat, int, (const char *filename, mode_t mode));
|
||||
# endif
|
||||
_GL_CXXALIASWARN (creat);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef creat
|
||||
/* Assume creat is always declared. */
|
||||
_GL_WARN_ON_USE (creat, "creat is not always POSIX compliant - "
|
||||
"use gnulib module creat for portability");
|
||||
#elif @GNULIB_MDA_CREAT@
|
||||
/* On native Windows, map 'creat' to '_creat', so that -loldnames is not
|
||||
required. In C++ with GNULIB_NAMESPACE, avoid differences between
|
||||
platforms by defining GNULIB_NAMESPACE::creat always. */
|
||||
# if defined _WIN32 && !defined __CYGWIN__
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# undef creat
|
||||
# define creat _creat
|
||||
# endif
|
||||
/* Need to cast, because in mingw the last argument is 'int mode'. */
|
||||
_GL_CXXALIAS_MDA_CAST (creat, int, (const char *filename, mode_t mode));
|
||||
# else
|
||||
_GL_CXXALIAS_SYS (creat, int, (const char *filename, mode_t mode));
|
||||
# endif
|
||||
_GL_CXXALIASWARN (creat);
|
||||
#endif
|
||||
|
||||
#if @GNULIB_FCNTL@
|
||||
# if @REPLACE_FCNTL@
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# undef fcntl
|
||||
# define fcntl rpl_fcntl
|
||||
# endif
|
||||
_GL_FUNCDECL_RPL (fcntl, int, (int fd, int action, ...));
|
||||
_GL_CXXALIAS_RPL (fcntl, int, (int fd, int action, ...));
|
||||
# if !GNULIB_defined_rpl_fcntl
|
||||
# define GNULIB_defined_rpl_fcntl 1
|
||||
# endif
|
||||
# else
|
||||
# if !@HAVE_FCNTL@
|
||||
_GL_FUNCDECL_SYS (fcntl, int, (int fd, int action, ...));
|
||||
# if !GNULIB_defined_fcntl
|
||||
# define GNULIB_defined_fcntl 1
|
||||
# endif
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (fcntl, int, (int fd, int action, ...));
|
||||
# endif
|
||||
_GL_CXXALIASWARN (fcntl);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef fcntl
|
||||
# if HAVE_RAW_DECL_FCNTL
|
||||
_GL_WARN_ON_USE (fcntl, "fcntl is not always POSIX compliant - "
|
||||
"use gnulib module fcntl for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if @GNULIB_OPEN@
|
||||
# if @REPLACE_OPEN@
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# undef open
|
||||
# define open rpl_open
|
||||
# endif
|
||||
_GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
|
||||
_GL_ARG_NONNULL ((1)));
|
||||
_GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
|
||||
# elif defined _WIN32 && !defined __CYGWIN__
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# undef open
|
||||
# define open _open
|
||||
# endif
|
||||
_GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
|
||||
# else
|
||||
_GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
|
||||
# endif
|
||||
/* On HP-UX 11, in C++ mode, open() is defined as an inline function with a
|
||||
default argument. _GL_CXXALIASWARN does not work in this case. */
|
||||
# if !defined __hpux
|
||||
_GL_CXXALIASWARN (open);
|
||||
# endif
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef open
|
||||
/* Assume open is always declared. */
|
||||
_GL_WARN_ON_USE (open, "open is not always POSIX compliant - "
|
||||
"use gnulib module open for portability");
|
||||
#elif @GNULIB_MDA_OPEN@
|
||||
/* On native Windows, map 'open' to '_open', so that -loldnames is not
|
||||
required. In C++ with GNULIB_NAMESPACE, avoid differences between
|
||||
platforms by defining GNULIB_NAMESPACE::open always. */
|
||||
# if defined _WIN32 && !defined __CYGWIN__
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# undef open
|
||||
# define open _open
|
||||
# endif
|
||||
_GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
|
||||
# else
|
||||
_GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
|
||||
# endif
|
||||
# if !defined __hpux
|
||||
_GL_CXXALIASWARN (open);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if @GNULIB_OPENAT@
|
||||
# if @REPLACE_OPENAT@
|
||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||
# undef openat
|
||||
# define openat rpl_openat
|
||||
# endif
|
||||
_GL_FUNCDECL_RPL (openat, int,
|
||||
(int fd, char const *file, int flags, /* mode_t mode */ ...)
|
||||
_GL_ARG_NONNULL ((2)));
|
||||
_GL_CXXALIAS_RPL (openat, int,
|
||||
(int fd, char const *file, int flags, /* mode_t mode */ ...));
|
||||
# else
|
||||
# if !@HAVE_OPENAT@
|
||||
_GL_FUNCDECL_SYS (openat, int,
|
||||
(int fd, char const *file, int flags, /* mode_t mode */ ...)
|
||||
_GL_ARG_NONNULL ((2)));
|
||||
# endif
|
||||
_GL_CXXALIAS_SYS (openat, int,
|
||||
(int fd, char const *file, int flags, /* mode_t mode */ ...));
|
||||
# endif
|
||||
_GL_CXXALIASWARN (openat);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef openat
|
||||
# if HAVE_RAW_DECL_OPENAT
|
||||
_GL_WARN_ON_USE (openat, "openat is not portable - "
|
||||
"use gnulib module openat for portability");
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/* Fix up the FD_* macros, only known to be missing on mingw. */
|
||||
|
||||
#ifndef FD_CLOEXEC
|
||||
# define FD_CLOEXEC 1
|
||||
#endif
|
||||
|
||||
/* Fix up the supported F_* macros. Intentionally leave other F_*
|
||||
macros undefined. Only known to be missing on mingw. */
|
||||
|
||||
#ifndef F_DUPFD_CLOEXEC
|
||||
# define F_DUPFD_CLOEXEC 0x40000000
|
||||
/* Witness variable: 1 if gnulib defined F_DUPFD_CLOEXEC, 0 otherwise. */
|
||||
# define GNULIB_defined_F_DUPFD_CLOEXEC 1
|
||||
#else
|
||||
# define GNULIB_defined_F_DUPFD_CLOEXEC 0
|
||||
#endif
|
||||
|
||||
#ifndef F_DUPFD
|
||||
# define F_DUPFD 1
|
||||
#endif
|
||||
|
||||
#ifndef F_GETFD
|
||||
# define F_GETFD 2
|
||||
#endif
|
||||
|
||||
/* Fix up the O_* macros. */
|
||||
|
||||
/* AIX 7.1 with XL C 12.1 defines O_CLOEXEC, O_NOFOLLOW, and O_TTY_INIT
|
||||
to values outside 'int' range, so omit these misdefinitions.
|
||||
But avoid namespace pollution on non-AIX systems. */
|
||||
#ifdef _AIX
|
||||
# include <limits.h>
|
||||
# if defined O_CLOEXEC && ! (INT_MIN <= O_CLOEXEC && O_CLOEXEC <= INT_MAX)
|
||||
# undef O_CLOEXEC
|
||||
# endif
|
||||
# if defined O_NOFOLLOW && ! (INT_MIN <= O_NOFOLLOW && O_NOFOLLOW <= INT_MAX)
|
||||
# undef O_NOFOLLOW
|
||||
# endif
|
||||
# if defined O_TTY_INIT && ! (INT_MIN <= O_TTY_INIT && O_TTY_INIT <= INT_MAX)
|
||||
# undef O_TTY_INIT
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if !defined O_DIRECT && defined O_DIRECTIO
|
||||
/* Tru64 spells it 'O_DIRECTIO'. */
|
||||
# define O_DIRECT O_DIRECTIO
|
||||
#endif
|
||||
|
||||
#if !defined O_CLOEXEC && defined O_NOINHERIT
|
||||
/* Mingw spells it 'O_NOINHERIT'. */
|
||||
# define O_CLOEXEC O_NOINHERIT
|
||||
#endif
|
||||
|
||||
#ifndef O_CLOEXEC
|
||||
# define O_CLOEXEC 0x40000000 /* Try to not collide with system O_* flags. */
|
||||
# define GNULIB_defined_O_CLOEXEC 1
|
||||
#else
|
||||
# define GNULIB_defined_O_CLOEXEC 0
|
||||
#endif
|
||||
|
||||
#ifndef O_DIRECT
|
||||
# define O_DIRECT 0
|
||||
#endif
|
||||
|
||||
#ifndef O_DIRECTORY
|
||||
# define O_DIRECTORY 0
|
||||
#endif
|
||||
|
||||
#ifndef O_DSYNC
|
||||
# define O_DSYNC 0
|
||||
#endif
|
||||
|
||||
#ifndef O_EXEC
|
||||
# define O_EXEC O_RDONLY /* This is often close enough in older systems. */
|
||||
#endif
|
||||
|
||||
#ifndef O_IGNORE_CTTY
|
||||
# define O_IGNORE_CTTY 0
|
||||
#endif
|
||||
|
||||
#ifndef O_NDELAY
|
||||
# define O_NDELAY 0
|
||||
#endif
|
||||
|
||||
#ifndef O_NOATIME
|
||||
# define O_NOATIME 0
|
||||
#endif
|
||||
|
||||
#ifndef O_NONBLOCK
|
||||
# define O_NONBLOCK O_NDELAY
|
||||
#endif
|
||||
|
||||
/* If the gnulib module 'nonblocking' is in use, guarantee a working non-zero
|
||||
value of O_NONBLOCK. Otherwise, O_NONBLOCK is defined (above) to O_NDELAY
|
||||
or to 0 as fallback. */
|
||||
#if @GNULIB_NONBLOCKING@
|
||||
# if O_NONBLOCK
|
||||
# define GNULIB_defined_O_NONBLOCK 0
|
||||
# else
|
||||
# define GNULIB_defined_O_NONBLOCK 1
|
||||
# undef O_NONBLOCK
|
||||
# define O_NONBLOCK 0x40000000
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef O_NOCTTY
|
||||
# define O_NOCTTY 0
|
||||
#endif
|
||||
|
||||
#ifndef O_NOFOLLOW
|
||||
# define O_NOFOLLOW 0
|
||||
#endif
|
||||
|
||||
#ifndef O_NOLINK
|
||||
# define O_NOLINK 0
|
||||
#endif
|
||||
|
||||
#ifndef O_NOLINKS
|
||||
# define O_NOLINKS 0
|
||||
#endif
|
||||
|
||||
#ifndef O_NOTRANS
|
||||
# define O_NOTRANS 0
|
||||
#endif
|
||||
|
||||
#ifndef O_RSYNC
|
||||
# define O_RSYNC 0
|
||||
#endif
|
||||
|
||||
#ifndef O_SEARCH
|
||||
# define O_SEARCH O_RDONLY /* This is often close enough in older systems. */
|
||||
#endif
|
||||
|
||||
#ifndef O_SYNC
|
||||
# define O_SYNC 0
|
||||
#endif
|
||||
|
||||
#ifndef O_TTY_INIT
|
||||
# define O_TTY_INIT 0
|
||||
#endif
|
||||
|
||||
#if ~O_ACCMODE & (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH)
|
||||
# undef O_ACCMODE
|
||||
# define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH)
|
||||
#endif
|
||||
|
||||
/* For systems that distinguish between text and binary I/O.
|
||||
O_BINARY is usually declared in fcntl.h */
|
||||
#if !defined O_BINARY && defined _O_BINARY
|
||||
/* For MSC-compatible compilers. */
|
||||
# define O_BINARY _O_BINARY
|
||||
# define O_TEXT _O_TEXT
|
||||
#endif
|
||||
|
||||
#if defined __BEOS__ || defined __HAIKU__
|
||||
/* BeOS 5 and Haiku have O_BINARY and O_TEXT, but they have no effect. */
|
||||
# undef O_BINARY
|
||||
# undef O_TEXT
|
||||
#endif
|
||||
|
||||
#ifndef O_BINARY
|
||||
# define O_BINARY 0
|
||||
# define O_TEXT 0
|
||||
#endif
|
||||
|
||||
/* Fix up the AT_* macros. */
|
||||
|
||||
/* Work around a bug in Solaris 9 and 10: AT_FDCWD is positive. Its
|
||||
value exceeds INT_MAX, so its use as an int doesn't conform to the
|
||||
C standard, and GCC and Sun C complain in some cases. If the bug
|
||||
is present, undef AT_FDCWD here, so it can be redefined below. */
|
||||
#if 0 < AT_FDCWD && AT_FDCWD == 0xffd19553
|
||||
# undef AT_FDCWD
|
||||
#endif
|
||||
|
||||
/* Use the same bit pattern as Solaris 9, but with the proper
|
||||
signedness. The bit pattern is important, in case this actually is
|
||||
Solaris with the above workaround. */
|
||||
#ifndef AT_FDCWD
|
||||
# define AT_FDCWD (-3041965)
|
||||
#endif
|
||||
|
||||
/* Use the same values as Solaris 9. This shouldn't matter, but
|
||||
there's no real reason to differ. */
|
||||
#ifndef AT_SYMLINK_NOFOLLOW
|
||||
# define AT_SYMLINK_NOFOLLOW 4096
|
||||
#endif
|
||||
|
||||
#ifndef AT_REMOVEDIR
|
||||
# define AT_REMOVEDIR 1
|
||||
#endif
|
||||
|
||||
/* Solaris 9 lacks these two, so just pick unique values. */
|
||||
#ifndef AT_SYMLINK_FOLLOW
|
||||
# define AT_SYMLINK_FOLLOW 2
|
||||
#endif
|
||||
|
||||
#ifndef AT_EACCESS
|
||||
# define AT_EACCESS 4
|
||||
#endif
|
||||
|
||||
/* Ignore this flag if not supported. */
|
||||
#ifndef AT_NO_AUTOMOUNT
|
||||
# define AT_NO_AUTOMOUNT 0
|
||||
#endif
|
||||
|
||||
#endif /* _@GUARD_PREFIX@_FCNTL_H */
|
||||
#endif /* _@GUARD_PREFIX@_FCNTL_H */
|
||||
#endif
|
22
gl/fd-hook.c
22
gl/fd-hook.c
|
@ -1,19 +1,19 @@
|
|||
/* Hook for making file descriptor functions close(), ioctl() extensible.
|
||||
Copyright (C) 2009-2023 Free Software Foundation, Inc.
|
||||
/* Hook for making making file descriptor functions close(), ioctl() extensible.
|
||||
Copyright (C) 2009-2013 Free Software Foundation, Inc.
|
||||
Written by Bruno Haible <bruno@clisp.org>, 2009.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
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 Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
|
22
gl/fd-hook.h
22
gl/fd-hook.h
|
@ -1,18 +1,18 @@
|
|||
/* Hook for making file descriptor functions close(), ioctl() extensible.
|
||||
Copyright (C) 2009-2023 Free Software Foundation, Inc.
|
||||
/* Hook for making making file descriptor functions close(), ioctl() extensible.
|
||||
Copyright (C) 2009-2013 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
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 Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
|
||||
#ifndef FD_HOOK_H
|
||||
|
|
233
gl/fflush.c
233
gl/fflush.c
|
@ -1,233 +0,0 @@
|
|||
/* fflush.c -- allow flushing input streams
|
||||
Copyright (C) 2007-2023 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Eric Blake. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include <stdio.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "freading.h"
|
||||
|
||||
#include "stdio-impl.h"
|
||||
|
||||
#undef fflush
|
||||
|
||||
|
||||
#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
|
||||
/* GNU libc, BeOS, Haiku, Linux libc5 */
|
||||
|
||||
/* Clear the stream's ungetc buffer, preserving the value of ftello (fp). */
|
||||
static void
|
||||
clear_ungetc_buffer_preserving_position (FILE *fp)
|
||||
{
|
||||
if (fp->_flags & _IO_IN_BACKUP)
|
||||
/* _IO_free_backup_area is a bit complicated. Simply call fseek. */
|
||||
fseeko (fp, 0, SEEK_CUR);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/* Clear the stream's ungetc buffer. May modify the value of ftello (fp). */
|
||||
static void
|
||||
clear_ungetc_buffer (FILE *fp)
|
||||
{
|
||||
# if defined __sferror || defined __DragonFly__ || defined __ANDROID__
|
||||
/* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
|
||||
if (HASUB (fp))
|
||||
{
|
||||
fp_->_p += fp_->_r;
|
||||
fp_->_r = 0;
|
||||
}
|
||||
# elif defined __EMX__ /* emx+gcc */
|
||||
if (fp->_ungetc_count > 0)
|
||||
{
|
||||
fp->_ungetc_count = 0;
|
||||
fp->_rcount = - fp->_rcount;
|
||||
}
|
||||
# elif defined _IOERR /* Minix, AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
|
||||
/* Nothing to do. */
|
||||
# else /* other implementations */
|
||||
fseeko (fp, 0, SEEK_CUR);
|
||||
# endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if ! (defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1)
|
||||
/* GNU libc, BeOS, Haiku, Linux libc5 */
|
||||
|
||||
# if (defined __sferror || defined __DragonFly__ || defined __ANDROID__) && defined __SNPT
|
||||
/* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
|
||||
|
||||
static int
|
||||
disable_seek_optimization (FILE *fp)
|
||||
{
|
||||
int saved_flags = fp_->_flags & (__SOPT | __SNPT);
|
||||
fp_->_flags = (fp_->_flags & ~__SOPT) | __SNPT;
|
||||
return saved_flags;
|
||||
}
|
||||
|
||||
static void
|
||||
restore_seek_optimization (FILE *fp, int saved_flags)
|
||||
{
|
||||
fp_->_flags = (fp_->_flags & ~(__SOPT | __SNPT)) | saved_flags;
|
||||
}
|
||||
|
||||
# else
|
||||
|
||||
static void
|
||||
update_fpos_cache (_GL_ATTRIBUTE_MAYBE_UNUSED FILE *fp,
|
||||
_GL_ATTRIBUTE_MAYBE_UNUSED off_t pos)
|
||||
{
|
||||
# if defined __sferror || defined __DragonFly__ || defined __ANDROID__
|
||||
/* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
|
||||
# if defined __CYGWIN__ || defined __ANDROID__
|
||||
/* fp_->_offset is typed as an integer. */
|
||||
fp_->_offset = pos;
|
||||
# else
|
||||
/* fp_->_offset is an fpos_t. */
|
||||
/* Use a union, since on NetBSD, the compilation flags determine
|
||||
whether fpos_t is typedef'd to off_t or a struct containing a
|
||||
single off_t member. */
|
||||
union
|
||||
{
|
||||
fpos_t f;
|
||||
off_t o;
|
||||
} u;
|
||||
u.o = pos;
|
||||
fp_->_offset = u.f;
|
||||
# endif
|
||||
fp_->_flags |= __SOFF;
|
||||
# endif
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Flush all pending data on STREAM according to POSIX rules. Both
|
||||
output and seekable input streams are supported. */
|
||||
int
|
||||
rpl_fflush (FILE *stream)
|
||||
{
|
||||
/* When stream is NULL, POSIX and C99 only require flushing of "output
|
||||
streams and update streams in which the most recent operation was not
|
||||
input", and all implementations do this.
|
||||
|
||||
When stream is "an output stream or an update stream in which the most
|
||||
recent operation was not input", POSIX and C99 requires that fflush
|
||||
writes out any buffered data, and all implementations do this.
|
||||
|
||||
When stream is, however, an input stream or an update stream in
|
||||
which the most recent operation was input, C99 specifies nothing,
|
||||
and POSIX only specifies behavior if the stream is seekable.
|
||||
mingw, in particular, drops the input buffer, leaving the file
|
||||
descriptor positioned at the end of the input buffer. I.e. ftell
|
||||
(stream) is lost. We don't want to call the implementation's
|
||||
fflush in this case.
|
||||
|
||||
We test ! freading (stream) here, rather than fwriting (stream), because
|
||||
what we need to know is whether the stream holds a "read buffer", and on
|
||||
mingw this is indicated by _IOREAD, regardless of _IOWRT. */
|
||||
if (stream == NULL || ! freading (stream))
|
||||
return fflush (stream);
|
||||
|
||||
#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
|
||||
/* GNU libc, BeOS, Haiku, Linux libc5 */
|
||||
|
||||
clear_ungetc_buffer_preserving_position (stream);
|
||||
|
||||
return fflush (stream);
|
||||
|
||||
#else
|
||||
{
|
||||
/* What POSIX says:
|
||||
1) About the file-position indicator (-> fseeko, ftello):
|
||||
The file position indicator is incremented by fgetc() and decremented
|
||||
by ungetc():
|
||||
<https://pubs.opengroup.org/onlinepubs/9699919799/functions/fgetc.html>
|
||||
"... the fgetc() function shall ... advance the associated file
|
||||
position indicator for the stream ..."
|
||||
<https://pubs.opengroup.org/onlinepubs/9699919799/functions/ungetc.html>
|
||||
"The file-position indicator is decremented by each successful
|
||||
call to ungetc()..."
|
||||
2) fflush discards bytes pushed back by ungetc:
|
||||
<https://pubs.opengroup.org/onlinepubs/9699919799/functions/fflush.html>
|
||||
"...any characters pushed back onto the stream by ungetc()
|
||||
or ungetwc() that have not subsequently been read from the
|
||||
stream shall be discarded..."
|
||||
This implies implicitly: fflush does not change the file position
|
||||
indicator.
|
||||
3) Effects on the file descriptor, if the file descriptor is capable of
|
||||
seeking:
|
||||
<https://pubs.opengroup.org/onlinepubs/9699919799/functions/fflush.html>
|
||||
"...the file offset of the underlying open file description shall
|
||||
be set to the file position of the stream..." */
|
||||
|
||||
/* POSIX does not specify fflush behavior for non-seekable input
|
||||
streams. Some implementations purge unread data, some return
|
||||
EBADF, some do nothing. */
|
||||
off_t pos = ftello (stream);
|
||||
if (pos == -1)
|
||||
{
|
||||
errno = EBADF;
|
||||
return EOF;
|
||||
}
|
||||
|
||||
/* Clear the ungetc buffer. */
|
||||
clear_ungetc_buffer (stream);
|
||||
|
||||
/* To get here, we must be flushing a seekable input stream, so the
|
||||
semantics of fpurge are now appropriate to clear the buffer. To
|
||||
avoid losing data, the lseek is also necessary. */
|
||||
{
|
||||
int result = fpurge (stream);
|
||||
if (result != 0)
|
||||
return result;
|
||||
}
|
||||
|
||||
# if (defined __sferror || defined __DragonFly__ || defined __ANDROID__) && defined __SNPT
|
||||
/* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
|
||||
|
||||
{
|
||||
/* Disable seek optimization for the next fseeko call. This tells the
|
||||
following fseeko call to seek to the desired position directly, rather
|
||||
than to seek to a block-aligned boundary. */
|
||||
int saved_flags = disable_seek_optimization (stream);
|
||||
int result = fseeko (stream, pos, SEEK_SET);
|
||||
|
||||
restore_seek_optimization (stream, saved_flags);
|
||||
return result;
|
||||
}
|
||||
|
||||
# else
|
||||
|
||||
pos = lseek (fileno (stream), pos, SEEK_SET);
|
||||
if (pos == -1)
|
||||
return EOF;
|
||||
/* After a successful lseek, update the file descriptor's position cache
|
||||
in the stream. */
|
||||
update_fpos_cache (stream, pos);
|
||||
|
||||
return 0;
|
||||
|
||||
# endif
|
||||
}
|
||||
#endif
|
||||
}
|
112
gl/filename.h
112
gl/filename.h
|
@ -1,112 +0,0 @@
|
|||
/* Basic filename support macros.
|
||||
Copyright (C) 2001-2023 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library 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
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* From Paul Eggert and Jim Meyering. */
|
||||
|
||||
#ifndef _FILENAME_H
|
||||
#define _FILENAME_H
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/* Filename support.
|
||||
ISSLASH(C) tests whether C is a directory separator
|
||||
character.
|
||||
HAS_DEVICE(Filename) tests whether Filename contains a device
|
||||
specification.
|
||||
FILE_SYSTEM_PREFIX_LEN(Filename) length of the device specification
|
||||
at the beginning of Filename,
|
||||
index of the part consisting of
|
||||
alternating components and slashes.
|
||||
FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
|
||||
1 when a non-empty device specification
|
||||
can be followed by an empty or relative
|
||||
part,
|
||||
0 when a non-empty device specification
|
||||
must be followed by a slash,
|
||||
0 when device specification don't exist.
|
||||
IS_ABSOLUTE_FILE_NAME(Filename)
|
||||
tests whether Filename is independent of
|
||||
any notion of "current directory".
|
||||
IS_RELATIVE_FILE_NAME(Filename)
|
||||
tests whether Filename may be concatenated
|
||||
to a directory filename.
|
||||
Note: On native Windows, OS/2, DOS, "c:" is neither an absolute nor a
|
||||
relative file name!
|
||||
IS_FILE_NAME_WITH_DIR(Filename) tests whether Filename contains a device
|
||||
or directory specification.
|
||||
*/
|
||||
#if defined _WIN32 || defined __CYGWIN__ \
|
||||
|| defined __EMX__ || defined __MSDOS__ || defined __DJGPP__
|
||||
/* Native Windows, Cygwin, OS/2, DOS */
|
||||
# define ISSLASH(C) ((C) == '/' || (C) == '\\')
|
||||
/* Internal macro: Tests whether a character is a drive letter. */
|
||||
# define _IS_DRIVE_LETTER(C) \
|
||||
(((C) >= 'A' && (C) <= 'Z') || ((C) >= 'a' && (C) <= 'z'))
|
||||
/* Help the compiler optimizing it. This assumes ASCII. */
|
||||
# undef _IS_DRIVE_LETTER
|
||||
# define _IS_DRIVE_LETTER(C) \
|
||||
(((unsigned int) (C) | ('a' - 'A')) - 'a' <= 'z' - 'a')
|
||||
# define HAS_DEVICE(Filename) \
|
||||
(_IS_DRIVE_LETTER ((Filename)[0]) && (Filename)[1] == ':')
|
||||
# define FILE_SYSTEM_PREFIX_LEN(Filename) (HAS_DEVICE (Filename) ? 2 : 0)
|
||||
# ifdef __CYGWIN__
|
||||
# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0
|
||||
# else
|
||||
/* On native Windows, OS/2, DOS, the system has the notion of a
|
||||
"current directory" on each drive. */
|
||||
# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 1
|
||||
# endif
|
||||
# if FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
|
||||
# define IS_ABSOLUTE_FILE_NAME(Filename) \
|
||||
ISSLASH ((Filename)[FILE_SYSTEM_PREFIX_LEN (Filename)])
|
||||
# else
|
||||
# define IS_ABSOLUTE_FILE_NAME(Filename) \
|
||||
(ISSLASH ((Filename)[0]) || HAS_DEVICE (Filename))
|
||||
# endif
|
||||
# define IS_RELATIVE_FILE_NAME(Filename) \
|
||||
(! (ISSLASH ((Filename)[0]) || HAS_DEVICE (Filename)))
|
||||
# define IS_FILE_NAME_WITH_DIR(Filename) \
|
||||
(strchr ((Filename), '/') != NULL || strchr ((Filename), '\\') != NULL \
|
||||
|| HAS_DEVICE (Filename))
|
||||
#else
|
||||
/* Unix */
|
||||
# define ISSLASH(C) ((C) == '/')
|
||||
# define HAS_DEVICE(Filename) ((void) (Filename), 0)
|
||||
# define FILE_SYSTEM_PREFIX_LEN(Filename) ((void) (Filename), 0)
|
||||
# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0
|
||||
# define IS_ABSOLUTE_FILE_NAME(Filename) ISSLASH ((Filename)[0])
|
||||
# define IS_RELATIVE_FILE_NAME(Filename) (! ISSLASH ((Filename)[0]))
|
||||
# define IS_FILE_NAME_WITH_DIR(Filename) (strchr ((Filename), '/') != NULL)
|
||||
#endif
|
||||
|
||||
/* Deprecated macros. For backward compatibility with old users of the
|
||||
'filename' module. */
|
||||
#define IS_ABSOLUTE_PATH IS_ABSOLUTE_FILE_NAME
|
||||
#define IS_PATH_WITH_DIR IS_FILE_NAME_WITH_DIR
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _FILENAME_H */
|
18
gl/float+.h
18
gl/float+.h
|
@ -1,19 +1,19 @@
|
|||
/* Supplemental information about the floating-point formats.
|
||||
Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
|
||||
Copyright (C) 2007, 2009-2013 Free Software Foundation, Inc.
|
||||
Written by Bruno Haible <bruno@clisp.org>, 2007.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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, or (at your option)
|
||||
any later version.
|
||||
|
||||
This file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _FLOATPLUS_H
|
||||
#define _FLOATPLUS_H
|
||||
|
|
18
gl/float.c
18
gl/float.c
|
@ -1,19 +1,19 @@
|
|||
/* Auxiliary definitions for <float.h>.
|
||||
Copyright (C) 2011-2023 Free Software Foundation, Inc.
|
||||
Copyright (C) 2011-2013 Free Software Foundation, Inc.
|
||||
Written by Bruno Haible <bruno@clisp.org>, 2011.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
|
|
@ -1,19 +1,19 @@
|
|||
/* A correct <float.h>.
|
||||
|
||||
Copyright (C) 2007-2023 Free Software Foundation, Inc.
|
||||
Copyright (C) 2007-2013 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _@GUARD_PREFIX@_FLOAT_H
|
||||
|
||||
|
@ -62,8 +62,8 @@
|
|||
|
||||
/* On FreeBSD/x86 6.4, the 'long double' type really has only 53 bits of
|
||||
precision in the compiler but 64 bits of precision at runtime. See
|
||||
<https://lists.gnu.org/r/bug-gnulib/2008-07/msg00063.html>. */
|
||||
#if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__)
|
||||
<http://lists.gnu.org/archive/html/bug-gnulib/2008-07/msg00063.html>. */
|
||||
#if defined __i386__ && defined __FreeBSD__
|
||||
/* Number of mantissa units, in base FLT_RADIX. */
|
||||
# undef LDBL_MANT_DIG
|
||||
# define LDBL_MANT_DIG 64
|
||||
|
@ -81,7 +81,7 @@
|
|||
# define LDBL_MAX_EXP 16384
|
||||
/* Minimum positive normalized number. */
|
||||
# undef LDBL_MIN
|
||||
# define LDBL_MIN 3.362103143112093506262677817321752E-4932L /* = 0x1p-16382L */
|
||||
# define LDBL_MIN 3.3621031431120935E-4932L /* = 0x1p-16382L */
|
||||
/* Maximum representable finite number. */
|
||||
# undef LDBL_MAX
|
||||
/* LDBL_MAX is represented as { 0xFFFFFFFF, 0xFFFFFFFF, 32766 }.
|
||||
|
@ -93,14 +93,11 @@
|
|||
extern const long double LDBL_MAX;
|
||||
|
||||
Unfortunately, this is not a constant expression. */
|
||||
# if !GNULIB_defined_long_double_union
|
||||
union gl_long_double_union
|
||||
{
|
||||
struct { unsigned int lo; unsigned int hi; unsigned int exponent; } xd;
|
||||
long double ld;
|
||||
};
|
||||
# define GNULIB_defined_long_double_union 1
|
||||
# endif
|
||||
extern const union gl_long_double_union gl_LDBL_MAX;
|
||||
# define LDBL_MAX (gl_LDBL_MAX.ld)
|
||||
/* Minimum e such that 10^e is in the range of normalized numbers. */
|
||||
|
@ -149,14 +146,11 @@ extern const union gl_long_double_union gl_LDBL_MAX;
|
|||
|
||||
Unfortunately, this is not a constant expression, and the latter expression
|
||||
does not work well when GCC is optimizing.. */
|
||||
# if !GNULIB_defined_long_double_union
|
||||
union gl_long_double_union
|
||||
{
|
||||
struct { double hi; double lo; } dd;
|
||||
long double ld;
|
||||
};
|
||||
# define GNULIB_defined_long_double_union 1
|
||||
# endif
|
||||
extern const union gl_long_double_union gl_LDBL_MAX;
|
||||
# define LDBL_MAX (gl_LDBL_MAX.ld)
|
||||
#endif
|
||||
|
|
20
gl/floor.c
20
gl/floor.c
|
@ -1,18 +1,18 @@
|
|||
/* Round towards negative infinity.
|
||||
Copyright (C) 2007, 2010-2023 Free Software Foundation, Inc.
|
||||
Copyright (C) 2007, 2010-2013 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser 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 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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
|
||||
|
||||
|
@ -44,7 +44,7 @@
|
|||
|
||||
/* MSVC with option -fp:strict refuses to compile constant initializers that
|
||||
contain floating-point operations. Pacify this compiler. */
|
||||
#if defined _MSC_VER && !defined __clang__
|
||||
#ifdef _MSC_VER
|
||||
# pragma fenv_access (off)
|
||||
#endif
|
||||
|
||||
|
|
18
gl/floorf.c
18
gl/floorf.c
|
@ -1,18 +1,18 @@
|
|||
/* Round towards negative infinity.
|
||||
Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
|
||||
Copyright (C) 2007, 2009-2013 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser 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 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 file is distributed in the hope that it will be useful,
|
||||
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 Lesser General Public License for more details.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
|
||||
|
||||
|
|
229
gl/fopen.c
229
gl/fopen.c
|
@ -1,229 +0,0 @@
|
|||
/* Open a stream to a file.
|
||||
Copyright (C) 2007-2023 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
|
||||
|
||||
/* If the user's config.h happens to include <stdio.h>, let it include only
|
||||
the system's <stdio.h> here, so that orig_fopen doesn't recurse to
|
||||
rpl_fopen. */
|
||||
#define _GL_ALREADY_INCLUDING_STDIO_H
|
||||
#include <config.h>
|
||||
|
||||
/* Get the original definition of fopen. It might be defined as a macro. */
|
||||
#include <stdio.h>
|
||||
#undef _GL_ALREADY_INCLUDING_STDIO_H
|
||||
|
||||
static FILE *
|
||||
orig_fopen (const char *filename, const char *mode)
|
||||
{
|
||||
return fopen (filename, mode);
|
||||
}
|
||||
|
||||
/* Specification. */
|
||||
/* Write "stdio.h" here, not <stdio.h>, otherwise OSF/1 5.1 DTK cc eliminates
|
||||
this include because of the preliminary #include <stdio.h> above. */
|
||||
#include "stdio.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
FILE *
|
||||
rpl_fopen (const char *filename, const char *mode)
|
||||
{
|
||||
int open_direction;
|
||||
int open_flags;
|
||||
#if GNULIB_FOPEN_GNU
|
||||
bool open_flags_gnu;
|
||||
# define BUF_SIZE 80
|
||||
char fdopen_mode_buf[BUF_SIZE + 1];
|
||||
#endif
|
||||
|
||||
#if defined _WIN32 && ! defined __CYGWIN__
|
||||
if (strcmp (filename, "/dev/null") == 0)
|
||||
filename = "NUL";
|
||||
#endif
|
||||
|
||||
/* Parse the mode. */
|
||||
open_direction = 0;
|
||||
open_flags = 0;
|
||||
#if GNULIB_FOPEN_GNU
|
||||
open_flags_gnu = false;
|
||||
#endif
|
||||
{
|
||||
const char *p = mode;
|
||||
#if GNULIB_FOPEN_GNU
|
||||
char *q = fdopen_mode_buf;
|
||||
#endif
|
||||
|
||||
for (; *p != '\0'; p++)
|
||||
{
|
||||
switch (*p)
|
||||
{
|
||||
case 'r':
|
||||
open_direction = O_RDONLY;
|
||||
#if GNULIB_FOPEN_GNU
|
||||
if (q < fdopen_mode_buf + BUF_SIZE)
|
||||
*q++ = *p;
|
||||
#endif
|
||||
continue;
|
||||
case 'w':
|
||||
open_direction = O_WRONLY;
|
||||
open_flags |= O_CREAT | O_TRUNC;
|
||||
#if GNULIB_FOPEN_GNU
|
||||
if (q < fdopen_mode_buf + BUF_SIZE)
|
||||
*q++ = *p;
|
||||
#endif
|
||||
continue;
|
||||
case 'a':
|
||||
open_direction = O_WRONLY;
|
||||
open_flags |= O_CREAT | O_APPEND;
|
||||
#if GNULIB_FOPEN_GNU
|
||||
if (q < fdopen_mode_buf + BUF_SIZE)
|
||||
*q++ = *p;
|
||||
#endif
|
||||
continue;
|
||||
case 'b':
|
||||
/* While it is non-standard, O_BINARY is guaranteed by
|
||||
gnulib <fcntl.h>. We can also assume that orig_fopen
|
||||
supports the 'b' flag. */
|
||||
open_flags |= O_BINARY;
|
||||
#if GNULIB_FOPEN_GNU
|
||||
if (q < fdopen_mode_buf + BUF_SIZE)
|
||||
*q++ = *p;
|
||||
#endif
|
||||
continue;
|
||||
case '+':
|
||||
open_direction = O_RDWR;
|
||||
#if GNULIB_FOPEN_GNU
|
||||
if (q < fdopen_mode_buf + BUF_SIZE)
|
||||
*q++ = *p;
|
||||
#endif
|
||||
continue;
|
||||
#if GNULIB_FOPEN_GNU
|
||||
case 'x':
|
||||
open_flags |= O_EXCL;
|
||||
open_flags_gnu = true;
|
||||
continue;
|
||||
case 'e':
|
||||
open_flags |= O_CLOEXEC;
|
||||
open_flags_gnu = true;
|
||||
continue;
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#if GNULIB_FOPEN_GNU
|
||||
/* The rest of the mode string can be a platform-dependent extension.
|
||||
Copy it unmodified. */
|
||||
{
|
||||
size_t len = strlen (p);
|
||||
if (len > fdopen_mode_buf + BUF_SIZE - q)
|
||||
len = fdopen_mode_buf + BUF_SIZE - q;
|
||||
memcpy (q, p, len);
|
||||
q += len;
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
#if GNULIB_FOPEN_GNU
|
||||
*q = '\0';
|
||||
#endif
|
||||
}
|
||||
|
||||
#if FOPEN_TRAILING_SLASH_BUG
|
||||
/* Fail if the mode requires write access and the filename ends in a slash,
|
||||
as POSIX says such a filename must name a directory
|
||||
<https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13>:
|
||||
"A pathname that contains at least one non-<slash> character and that
|
||||
ends with one or more trailing <slash> characters shall not be resolved
|
||||
successfully unless the last pathname component before the trailing
|
||||
<slash> characters names an existing directory"
|
||||
If the named file already exists as a directory, then if a mode that
|
||||
requires write access is specified, fopen() must fail because POSIX
|
||||
<https://pubs.opengroup.org/onlinepubs/9699919799/functions/fopen.html>
|
||||
says that it fails with errno = EISDIR in this case.
|
||||
If the named file does not exist or does not name a directory, then
|
||||
fopen() must fail since the file does not contain a '.' directory. */
|
||||
{
|
||||
size_t len = strlen (filename);
|
||||
if (len > 0 && filename[len - 1] == '/')
|
||||
{
|
||||
int fd;
|
||||
struct stat statbuf;
|
||||
FILE *fp;
|
||||
|
||||
if (open_direction != O_RDONLY)
|
||||
{
|
||||
errno = EISDIR;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fd = open (filename, open_direction | open_flags,
|
||||
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
|
||||
if (fd < 0)
|
||||
return NULL;
|
||||
|
||||
if (fstat (fd, &statbuf) >= 0 && !S_ISDIR (statbuf.st_mode))
|
||||
{
|
||||
close (fd);
|
||||
errno = ENOTDIR;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
# if GNULIB_FOPEN_GNU
|
||||
fp = fdopen (fd, fdopen_mode_buf);
|
||||
# else
|
||||
fp = fdopen (fd, mode);
|
||||
# endif
|
||||
if (fp == NULL)
|
||||
{
|
||||
int saved_errno = errno;
|
||||
close (fd);
|
||||
errno = saved_errno;
|
||||
}
|
||||
return fp;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if GNULIB_FOPEN_GNU
|
||||
if (open_flags_gnu)
|
||||
{
|
||||
int fd;
|
||||
FILE *fp;
|
||||
|
||||
fd = open (filename, open_direction | open_flags,
|
||||
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
|
||||
if (fd < 0)
|
||||
return NULL;
|
||||
|
||||
fp = fdopen (fd, fdopen_mode_buf);
|
||||
if (fp == NULL)
|
||||
{
|
||||
int saved_errno = errno;
|
||||
close (fd);
|
||||
errno = saved_errno;
|
||||
}
|
||||
return fp;
|
||||
}
|
||||
#endif
|
||||
|
||||
return orig_fopen (filename, mode);
|
||||
}
|
150
gl/fpurge.c
150
gl/fpurge.c
|
@ -1,150 +0,0 @@
|
|||
/* Flushing buffers of a FILE stream.
|
||||
Copyright (C) 2007-2023 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include <stdio.h>
|
||||
|
||||
#if HAVE___FPURGE /* glibc >= 2.2, Haiku, Solaris >= 7, UnixWare >= 7.1.4.MP4, Cygwin >= 1.7.10, Android API >= 23, musl libc */
|
||||
# if HAVE_STDIO_EXT_H
|
||||
# include <stdio_ext.h>
|
||||
# endif
|
||||
#endif
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "stdio-impl.h"
|
||||
|
||||
int
|
||||
fpurge (FILE *fp)
|
||||
{
|
||||
#if HAVE___FPURGE /* glibc >= 2.2, Haiku, Solaris >= 7, UnixWare >= 7.1.4.MP4, Cygwin >= 1.7.10, Android API >= 23, musl libc */
|
||||
|
||||
__fpurge (fp);
|
||||
/* The __fpurge function does not have a return value. */
|
||||
return 0;
|
||||
|
||||
#elif HAVE_FPURGE /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin >= 1.7 */
|
||||
|
||||
/* Call the system's fpurge function. */
|
||||
# undef fpurge
|
||||
# if !HAVE_DECL_FPURGE
|
||||
extern int fpurge (FILE *);
|
||||
# endif
|
||||
int result = fpurge (fp);
|
||||
# if defined __sferror || defined __DragonFly__ || defined __ANDROID__
|
||||
/* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
|
||||
if (result == 0)
|
||||
/* Correct the invariants that fpurge broke.
|
||||
<stdio.h> on BSD systems says:
|
||||
"The following always hold: if _flags & __SRD, _w is 0."
|
||||
If this invariant is not fulfilled and the stream is read-write but
|
||||
currently reading, subsequent putc or fputc calls will write directly
|
||||
into the buffer, although they shouldn't be allowed to. */
|
||||
if ((fp_->_flags & __SRD) != 0)
|
||||
fp_->_w = 0;
|
||||
# endif
|
||||
return result;
|
||||
|
||||
#else
|
||||
|
||||
/* Most systems provide FILE as a struct and the necessary bitmask in
|
||||
<stdio.h>, because they need it for implementing getc() and putc() as
|
||||
fast macros. */
|
||||
# if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
|
||||
/* GNU libc, BeOS, Haiku, Linux libc5 */
|
||||
fp->_IO_read_end = fp->_IO_read_ptr;
|
||||
fp->_IO_write_ptr = fp->_IO_write_base;
|
||||
/* Avoid memory leak when there is an active ungetc buffer. */
|
||||
if (fp->_IO_save_base != NULL)
|
||||
{
|
||||
free (fp->_IO_save_base);
|
||||
fp->_IO_save_base = NULL;
|
||||
}
|
||||
return 0;
|
||||
# elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
|
||||
/* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
|
||||
fp_->_p = fp_->_bf._base;
|
||||
fp_->_r = 0;
|
||||
fp_->_w = ((fp_->_flags & (__SLBF | __SNBF | __SRD)) == 0 /* fully buffered and not currently reading? */
|
||||
? fp_->_bf._size
|
||||
: 0);
|
||||
/* Avoid memory leak when there is an active ungetc buffer. */
|
||||
if (fp_ub._base != NULL)
|
||||
{
|
||||
if (fp_ub._base != fp_->_ubuf)
|
||||
free (fp_ub._base);
|
||||
fp_ub._base = NULL;
|
||||
}
|
||||
return 0;
|
||||
# elif defined __EMX__ /* emx+gcc */
|
||||
fp->_ptr = fp->_buffer;
|
||||
fp->_rcount = 0;
|
||||
fp->_wcount = 0;
|
||||
fp->_ungetc_count = 0;
|
||||
return 0;
|
||||
# elif defined __minix /* Minix */
|
||||
fp->_ptr = fp->_buf;
|
||||
if (fp->_ptr != NULL)
|
||||
fp->_count = 0;
|
||||
return 0;
|
||||
# elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
|
||||
fp_->_ptr = fp_->_base;
|
||||
if (fp_->_ptr != NULL)
|
||||
fp_->_cnt = 0;
|
||||
return 0;
|
||||
# elif defined __UCLIBC__ /* uClibc */
|
||||
# ifdef __STDIO_BUFFERS
|
||||
if (fp->__modeflags & __FLAG_WRITING)
|
||||
fp->__bufpos = fp->__bufstart;
|
||||
else if (fp->__modeflags & (__FLAG_READONLY | __FLAG_READING))
|
||||
fp->__bufpos = fp->__bufread;
|
||||
# endif
|
||||
return 0;
|
||||
# elif defined __QNX__ /* QNX */
|
||||
fp->_Rback = fp->_Back + sizeof (fp->_Back);
|
||||
fp->_Rsave = NULL;
|
||||
if (fp->_Mode & 0x2000 /* _MWRITE */)
|
||||
/* fp->_Buf <= fp->_Next <= fp->_Wend */
|
||||
fp->_Next = fp->_Buf;
|
||||
else
|
||||
/* fp->_Buf <= fp->_Next <= fp->_Rend */
|
||||
fp->_Rend = fp->_Next;
|
||||
return 0;
|
||||
# elif defined __MINT__ /* Atari FreeMiNT */
|
||||
if (fp->__pushed_back)
|
||||
{
|
||||
fp->__bufp = fp->__pushback_bufp;
|
||||
fp->__pushed_back = 0;
|
||||
}
|
||||
/* Preserve the current file position. */
|
||||
if (fp->__target != -1)
|
||||
fp->__target += fp->__bufp - fp->__buffer;
|
||||
fp->__bufp = fp->__buffer;
|
||||
/* Nothing in the buffer, next getc is nontrivial. */
|
||||
fp->__get_limit = fp->__bufp;
|
||||
/* Nothing in the buffer, next putc is nontrivial. */
|
||||
fp->__put_limit = fp->__buffer;
|
||||
return 0;
|
||||
# elif defined EPLAN9 /* Plan9 */
|
||||
fp->rp = fp->wp = fp->lp = fp->buf;
|
||||
return 0;
|
||||
# else
|
||||
# error "Please port gnulib fpurge.c to your platform! Look at the definitions of fflush, setvbuf and ungetc on your system, then report this to bug-gnulib."
|
||||
# endif
|
||||
|
||||
#endif
|
||||
}
|
|
@ -1,76 +0,0 @@
|
|||
/* Retrieve information about a FILE stream.
|
||||
Copyright (C) 2007-2023 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include "freading.h"
|
||||
|
||||
#include "stdio-impl.h"
|
||||
|
||||
/* Don't use glibc's __freading function in glibc < 2.7, see
|
||||
<https://sourceware.org/bugzilla/show_bug.cgi?id=4359> */
|
||||
#if !(HAVE___FREADING && (!defined __GLIBC__ || defined __UCLIBC__ || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7)))
|
||||
|
||||
bool
|
||||
freading (FILE *fp)
|
||||
{
|
||||
/* Most systems provide FILE as a struct and the necessary bitmask in
|
||||
<stdio.h>, because they need it for implementing getc() and putc() as
|
||||
fast macros. */
|
||||
# if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
|
||||
/* GNU libc, BeOS, Haiku, Linux libc5 */
|
||||
return ((fp->_flags & _IO_NO_WRITES) != 0
|
||||
|| ((fp->_flags & (_IO_NO_READS | _IO_CURRENTLY_PUTTING)) == 0
|
||||
&& fp->_IO_read_base != NULL));
|
||||
# elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
|
||||
/* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin < 1.7.34, Minix 3, Android */
|
||||
return (fp_->_flags & __SRD) != 0;
|
||||
# elif defined __EMX__ /* emx+gcc */
|
||||
return (fp->_flags & _IOREAD) != 0;
|
||||
# elif defined __minix /* Minix */
|
||||
return (fp->_flags & _IOREADING) != 0;
|
||||
# elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
|
||||
# if defined __sun /* Solaris */
|
||||
return (fp_->_flag & _IOREAD) != 0 && (fp_->_flag & _IOWRT) == 0;
|
||||
# else
|
||||
return (fp_->_flag & _IOREAD) != 0;
|
||||
# endif
|
||||
# elif defined __UCLIBC__ /* uClibc */
|
||||
return (fp->__modeflags & (__FLAG_READONLY | __FLAG_READING)) != 0;
|
||||
# elif defined __QNX__ /* QNX */
|
||||
return ((fp->_Mode & 0x2 /* _MOPENW */) == 0
|
||||
|| (fp->_Mode & 0x1000 /* _MREAD */) != 0);
|
||||
# elif defined __MINT__ /* Atari FreeMiNT */
|
||||
if (!fp->__mode.__write)
|
||||
return 1;
|
||||
if (!fp->__mode.__read)
|
||||
return 0;
|
||||
# ifdef _IO_CURRENTLY_GETTING /* Flag added on 2009-02-28 */
|
||||
return (fp->__flags & _IO_CURRENTLY_GETTING) != 0;
|
||||
# else
|
||||
return (fp->__buffer < fp->__get_limit /*|| fp->__bufp == fp->__put_limit ??*/);
|
||||
# endif
|
||||
# elif defined EPLAN9 /* Plan9 */
|
||||
if (fp->state == 0 /* CLOSED */ || fp->state == 4 /* WR */)
|
||||
return 0;
|
||||
return (fp->state == 3 /* RD */ && (fp->bufl == 0 || fp->rp < fp->wp));
|
||||
# else
|
||||
# error "Please port gnulib freading.c to your platform!"
|
||||
# endif
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,54 +0,0 @@
|
|||
/* Retrieve information about a FILE stream.
|
||||
Copyright (C) 2007-2023 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/* Return true if the stream STREAM is opened read-only, or if the
|
||||
last operation on the stream was a read operation. Return false if
|
||||
the stream is opened write-only or append-only, or if it supports
|
||||
writing and there is no current read operation (such as fgetc).
|
||||
|
||||
freading and fwriting will never both be true. If STREAM supports
|
||||
both reads and writes, then:
|
||||
- both freading and fwriting might be false when the stream is first
|
||||
opened, after read encounters EOF, or after fflush,
|
||||
- freading might be false or true and fwriting might be false
|
||||
after repositioning (such as fseek, fsetpos, or rewind),
|
||||
depending on the underlying implementation.
|
||||
|
||||
STREAM must not be wide-character oriented. */
|
||||
|
||||
#if HAVE___FREADING && (!defined __GLIBC__ || defined __UCLIBC__ || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7))
|
||||
/* Solaris >= 7, UnixWare >= 7.1.4.MP4, Cygwin >= 1.7.34, Android API >= 29, not glibc >= 2.2, but glibc >= 2.7, or musl libc */
|
||||
|
||||
# if HAVE_STDIO_EXT_H
|
||||
# include <stdio_ext.h>
|
||||
# endif
|
||||
# define freading(stream) (__freading (stream) != 0)
|
||||
|
||||
#else
|
||||
|
||||
# ifdef __cplusplus
|
||||
extern "C" {
|
||||
# endif
|
||||
|
||||
extern bool freading (FILE *stream) _GL_ATTRIBUTE_PURE;
|
||||
|
||||
# ifdef __cplusplus
|
||||
}
|
||||
# endif
|
||||
|
||||
#endif
|
53
gl/free.c
53
gl/free.c
|
@ -1,53 +0,0 @@
|
|||
/* Make free() preserve errno.
|
||||
|
||||
Copyright (C) 2003, 2006, 2009-2023 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* written by Paul Eggert */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include <stdlib.h>
|
||||
|
||||
/* A function definition is only needed if HAVE_FREE_POSIX is not defined. */
|
||||
#if !HAVE_FREE_POSIX
|
||||
|
||||
# include <errno.h>
|
||||
|
||||
void
|
||||
rpl_free (void *p)
|
||||
# undef free
|
||||
{
|
||||
# if defined __GNUC__ && !defined __clang__
|
||||
/* An invalid GCC optimization
|
||||
<https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98396>
|
||||
would optimize away the assignments in the code below, when link-time
|
||||
optimization (LTO) is enabled. Make the code more complicated, so that
|
||||
GCC does not grok how to optimize it. */
|
||||
int err[2];
|
||||
err[0] = errno;
|
||||
err[1] = errno;
|
||||
errno = 0;
|
||||
free (p);
|
||||
errno = err[errno == 0];
|
||||
# else
|
||||
int err = errno;
|
||||
free (p);
|
||||
errno = err;
|
||||
# endif
|
||||
}
|
||||
|
||||
#endif
|
30
gl/fseek.c
30
gl/fseek.c
|
@ -1,30 +0,0 @@
|
|||
/* An fseek() function that, together with fflush(), is POSIX compliant.
|
||||
Copyright (C) 2007, 2009-2023 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include <stdio.h>
|
||||
|
||||
/* Get off_t. */
|
||||
#include <unistd.h>
|
||||
|
||||
int
|
||||
fseek (FILE *fp, long offset, int whence)
|
||||
{
|
||||
/* Use the replacement fseeko function with all its workarounds. */
|
||||
return fseeko (fp, (off_t)offset, whence);
|
||||
}
|
164
gl/fseeko.c
164
gl/fseeko.c
|
@ -1,164 +0,0 @@
|
|||
/* An fseeko() function that, together with fflush(), is POSIX compliant.
|
||||
Copyright (C) 2007-2023 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include <stdio.h>
|
||||
|
||||
/* Get off_t, lseek, _POSIX_VERSION. */
|
||||
#include <unistd.h>
|
||||
|
||||
#include "stdio-impl.h"
|
||||
|
||||
int
|
||||
fseeko (FILE *fp, off_t offset, int whence)
|
||||
#undef fseeko
|
||||
#if !HAVE_FSEEKO
|
||||
# undef fseek
|
||||
# define fseeko fseek
|
||||
#endif
|
||||
#if _GL_WINDOWS_64_BIT_OFF_T
|
||||
# undef fseeko
|
||||
# if HAVE__FSEEKI64 && HAVE_DECL__FSEEKI64 /* msvc, mingw since msvcrt8.0, mingw64 */
|
||||
# define fseeko _fseeki64
|
||||
# else /* mingw before msvcrt8.0 */
|
||||
# define fseeko fseeko64
|
||||
# endif
|
||||
#endif
|
||||
{
|
||||
#if LSEEK_PIPE_BROKEN
|
||||
/* mingw gives bogus answers rather than failure on non-seekable files. */
|
||||
if (lseek (fileno (fp), 0, SEEK_CUR) == -1)
|
||||
return EOF;
|
||||
#endif
|
||||
|
||||
/* These tests are based on fpurge.c. */
|
||||
#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
|
||||
/* GNU libc, BeOS, Haiku, Linux libc5 */
|
||||
if (fp->_IO_read_end == fp->_IO_read_ptr
|
||||
&& fp->_IO_write_ptr == fp->_IO_write_base
|
||||
&& fp->_IO_save_base == NULL)
|
||||
#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
|
||||
/* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
|
||||
# if defined __SL64 && defined __SCLE /* Cygwin */
|
||||
if ((fp->_flags & __SL64) == 0)
|
||||
{
|
||||
/* Cygwin 1.5.0 through 1.5.24 failed to open stdin in 64-bit
|
||||
mode; but has an fseeko that requires 64-bit mode. */
|
||||
FILE *tmp = fopen ("/dev/null", "r");
|
||||
if (!tmp)
|
||||
return -1;
|
||||
fp->_flags |= __SL64;
|
||||
fp->_seek64 = tmp->_seek64;
|
||||
fclose (tmp);
|
||||
}
|
||||
# endif
|
||||
if (fp_->_p == fp_->_bf._base
|
||||
&& fp_->_r == 0
|
||||
&& fp_->_w == ((fp_->_flags & (__SLBF | __SNBF | __SRD)) == 0 /* fully buffered and not currently reading? */
|
||||
? fp_->_bf._size
|
||||
: 0)
|
||||
&& fp_ub._base == NULL)
|
||||
#elif defined __EMX__ /* emx+gcc */
|
||||
if (fp->_ptr == fp->_buffer
|
||||
&& fp->_rcount == 0
|
||||
&& fp->_wcount == 0
|
||||
&& fp->_ungetc_count == 0)
|
||||
#elif defined __minix /* Minix */
|
||||
if (fp_->_ptr == fp_->_buf
|
||||
&& (fp_->_ptr == NULL || fp_->_count == 0))
|
||||
#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
|
||||
if (fp_->_ptr == fp_->_base
|
||||
&& (fp_->_ptr == NULL || fp_->_cnt == 0))
|
||||
#elif defined __UCLIBC__ /* uClibc */
|
||||
if (((fp->__modeflags & __FLAG_WRITING) == 0
|
||||
|| fp->__bufpos == fp->__bufstart)
|
||||
&& ((fp->__modeflags & (__FLAG_READONLY | __FLAG_READING)) == 0
|
||||
|| fp->__bufpos == fp->__bufread))
|
||||
#elif defined __QNX__ /* QNX */
|
||||
if ((fp->_Mode & 0x2000 /* _MWRITE */ ? fp->_Next == fp->_Buf : fp->_Next == fp->_Rend)
|
||||
&& fp->_Rback == fp->_Back + sizeof (fp->_Back)
|
||||
&& fp->_Rsave == NULL)
|
||||
#elif defined __MINT__ /* Atari FreeMiNT */
|
||||
if (fp->__bufp == fp->__buffer
|
||||
&& fp->__get_limit == fp->__bufp
|
||||
&& fp->__put_limit == fp->__bufp
|
||||
&& !fp->__pushed_back)
|
||||
#elif defined EPLAN9 /* Plan9 */
|
||||
if (fp->rp == fp->buf
|
||||
&& fp->wp == fp->buf)
|
||||
#elif FUNC_FFLUSH_STDIN < 0 && 200809 <= _POSIX_VERSION
|
||||
/* Cross-compiling to some other system advertising conformance to
|
||||
POSIX.1-2008 or later. Assume fseeko and fflush work as advertised.
|
||||
If this assumption is incorrect, please report the bug to
|
||||
bug-gnulib. */
|
||||
if (0)
|
||||
#else
|
||||
#error "Please port gnulib fseeko.c to your platform! Look at the code in fseeko.c, then report this to bug-gnulib."
|
||||
#endif
|
||||
{
|
||||
/* We get here when an fflush() call immediately preceded this one (or
|
||||
if ftell() has created buffers but no I/O has occurred on a
|
||||
newly-opened stream). We know there are no buffers. */
|
||||
off_t pos = lseek (fileno (fp), offset, whence);
|
||||
if (pos == -1)
|
||||
{
|
||||
#if defined __sferror || defined __DragonFly__ || defined __ANDROID__
|
||||
/* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
|
||||
fp_->_flags &= ~__SOFF;
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
|
||||
/* GNU libc, BeOS, Haiku, Linux libc5 */
|
||||
fp->_flags &= ~_IO_EOF_SEEN;
|
||||
fp->_offset = pos;
|
||||
#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
|
||||
/* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
|
||||
# if defined __CYGWIN__ || (defined __NetBSD__ && __NetBSD_Version__ >= 600000000) || defined __minix
|
||||
/* fp_->_offset is typed as an integer. */
|
||||
fp_->_offset = pos;
|
||||
# else
|
||||
/* fp_->_offset is an fpos_t. */
|
||||
{
|
||||
/* Use a union, since on NetBSD, the compilation flags
|
||||
determine whether fpos_t is typedef'd to off_t or a struct
|
||||
containing a single off_t member. */
|
||||
union
|
||||
{
|
||||
fpos_t f;
|
||||
off_t o;
|
||||
} u;
|
||||
u.o = pos;
|
||||
fp_->_offset = u.f;
|
||||
}
|
||||
# endif
|
||||
fp_->_flags |= __SOFF;
|
||||
fp_->_flags &= ~__SEOF;
|
||||
#elif defined __EMX__ /* emx+gcc */
|
||||
fp->_flags &= ~_IOEOF;
|
||||
#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
|
||||
fp_->_flag &= ~_IOEOF;
|
||||
#elif defined __MINT__ /* Atari FreeMiNT */
|
||||
fp->__offset = pos;
|
||||
fp->__eof = 0;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
return fseeko (fp, offset, whence);
|
||||
}
|
94
gl/fstat.c
94
gl/fstat.c
|
@ -1,94 +0,0 @@
|
|||
/* fstat() replacement.
|
||||
Copyright (C) 2011-2023 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This file 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* If the user's config.h happens to include <sys/stat.h>, let it include only
|
||||
the system's <sys/stat.h> here, so that orig_fstat doesn't recurse to
|
||||
rpl_fstat. */
|
||||
#define __need_system_sys_stat_h
|
||||
#include <config.h>
|
||||
|
||||
/* Get the original definition of fstat. It might be defined as a macro. */
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#undef __need_system_sys_stat_h
|
||||
|
||||
#if defined _WIN32 && ! defined __CYGWIN__
|
||||
# define WINDOWS_NATIVE
|
||||
#endif
|
||||
|
||||
#if !defined WINDOWS_NATIVE
|
||||
|
||||
static int
|
||||
orig_fstat (int fd, struct stat *buf)
|
||||
{
|
||||
return fstat (fd, buf);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* Specification. */
|
||||
#ifdef __osf__
|
||||
/* Write "sys/stat.h" here, not <sys/stat.h>, otherwise OSF/1 5.1 DTK cc
|
||||
eliminates this include because of the preliminary #include <sys/stat.h>
|
||||
above. */
|
||||
# include "sys/stat.h"
|
||||
#else
|
||||
# include <sys/stat.h>
|
||||
#endif
|
||||
|
||||
#include "stat-time.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#ifdef WINDOWS_NATIVE
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
# include <windows.h>
|
||||
# if GNULIB_MSVC_NOTHROW
|
||||
# include "msvc-nothrow.h"
|
||||
# else
|
||||
# include <io.h>
|
||||
# endif
|
||||
# include "stat-w32.h"
|
||||
#endif
|
||||
|
||||
int
|
||||
rpl_fstat (int fd, struct stat *buf)
|
||||
{
|
||||
#if REPLACE_FCHDIR && REPLACE_OPEN_DIRECTORY
|
||||
/* Handle the case when rpl_open() used a dummy file descriptor to work
|
||||
around an open() that can't normally visit directories. */
|
||||
const char *name = _gl_directory_name (fd);
|
||||
if (name != NULL)
|
||||
return stat (name, buf);
|
||||
#endif
|
||||
|
||||
#ifdef WINDOWS_NATIVE
|
||||
/* Fill the fields ourselves, because the original fstat function returns
|
||||
values for st_atime, st_mtime, st_ctime that depend on the current time
|
||||
zone. See
|
||||
<https://lists.gnu.org/r/bug-gnulib/2017-04/msg00134.html> */
|
||||
HANDLE h = (HANDLE) _get_osfhandle (fd);
|
||||
|
||||
if (h == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
errno = EBADF;
|
||||
return -1;
|
||||
}
|
||||
return _gl_fstat_by_handle (h, NULL, buf);
|
||||
#else
|
||||
return stat_time_normalize (orig_fstat (fd, buf), buf);
|
||||
#endif
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue