libstatgrab-0.90/000755 001750 001750 00000000000 12200045620 013703 5ustar00tdbusers000000 000000 libstatgrab-0.90/examples/000755 001750 001750 00000000000 12200045615 015525 5ustar00tdbusers000000 000000 libstatgrab-0.90/missing000555 001750 001750 00000023703 12200045540 015306 0ustar00tdbusers000000 000000 #! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2012-01-06.18; # UTC # Copyright (C) 1996-2012 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception 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. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, 'missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle 'PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file 'aclocal.m4' autoconf touch file 'configure' autoheader touch file 'config.h.in' autom4te touch the output file, or create a stub one automake touch all 'Makefile.in' files bison create 'y.tab.[ch]', if possible, from existing .[ch] flex create 'lex.yy.c', if possible, from existing .c help2man touch the output file lex create 'lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create 'y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running '$TOOL --version' or '$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: '$1' is $msg. You should only need it if you modified 'acinclude.m4' or '${configure_ac}'. You might want to install the Automake and Perl packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: '$1' is $msg. You should only need it if you modified '${configure_ac}'. You might want to install the Autoconf and GNU m4 packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: '$1' is $msg. You should only need it if you modified 'acconfig.h' or '${configure_ac}'. You might want to install the Autoconf and GNU m4 packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: '$1' is $msg. You should only need it if you modified 'Makefile.am', 'acinclude.m4' or '${configure_ac}'. You might want to install the Automake and Perl packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: '$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get '$1' as part of Autoconf from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: '$1' $msg. You should only need it if you modified a '.y' file. You may need the Bison package in order for those modifications to take effect. You can get Bison from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: '$1' is $msg. You should only need it if you modified a '.l' file. You may need the Flex package in order for those modifications to take effect. You can get Flex from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: '$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the Help2man package in order for those modifications to take effect. You can get Help2man from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: '$1' is $msg. You should only need it if you modified a '.texi' or '.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy 'make' (AIX, DU, IRIX). You might want to install the Texinfo package or the GNU make package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; *) echo 1>&2 "\ WARNING: '$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the 'README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing '$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: libstatgrab-0.90/Makefile.in000644 001750 001750 00000067205 12200045540 015763 0ustar00tdbusers000000 000000 # Makefile.in generated by automake 1.12.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile for libstatgrab # http://www.i-scream.org/libstatgrab/ # $Id$ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/libstatgrab.pc.in $(top_srcdir)/configure AUTHORS \ COPYING ChangeLog INSTALL NEWS ar-lib config.guess config.sub \ install-sh ltmain.sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_lib.m4 \ $(top_srcdir)/m4/ax_ncurses.m4 $(top_srcdir)/m4/ax_perl5.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_shellvars.m4 $(top_srcdir)/m4/ax_types.m4 \ $(top_srcdir)/m4/ax_visibility.m4 $(top_srcdir)/m4/ax_win32.m4 \ $(top_srcdir)/m4/ax_xopen.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = libstatgrab.pc CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgconfigdir)" DATA = $(pkgconfig_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ cscope distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = src examples docs tests DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIN_GROUP = @BIN_GROUP@ BIN_OWNER = @BIN_OWNER@ BIN_PERM = @BIN_PERM@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CLIBFLAGS = @CLIBFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOCBOOK2MAN = @DOCBOOK2MAN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ HAVE_LIBLOG4CPLUS = @HAVE_LIBLOG4CPLUS@ INC_LOG4CPLUS = @INC_LOG4CPLUS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBS_LOG4CPLUS = @LIBS_LOG4CPLUS@ LIBTOOL = @LIBTOOL@ LINKFLAGS = @LINKFLAGS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL5 = @PERL5@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SAIDARCPPFLAGS = @SAIDARCPPFLAGS@ SAIDARLIBS = @SAIDARLIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SG_EXPORT = @SG_EXPORT@ SG_IMPORT = @SG_IMPORT@ SG_PRIVATE = @SG_PRIVATE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_LIBLOG4CPLUS = @WITH_LIBLOG4CPLUS@ WITH_THREADS_CONFIGURED = @WITH_THREADS_CONFIGURED@ WITH_VISIBILITY_SUPPORT = @WITH_VISIBILITY_SUPPORT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log4cplus_CFLAGS = @log4cplus_CFLAGS@ log4cplus_LIBS = @log4cplus_LIBS@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = gnu ACLOCAL_AMFLAGS = -I m4 DOCS_SUBDIR = docs @TESTS_TRUE@TESTS_SUBDIR = tests SUBDIRS = src examples $(DOCS_SUBDIR) $(TESTS_SUBDIR) EXTRA_DIST = libstatgrab.pc.in PLATFORMS COPYING COPYING.LGPL MAINTAINERCLEANFILES = ChangeLog pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libstatgrab.pc all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 libstatgrab.pc: $(top_builddir)/config.status $(srcdir)/libstatgrab.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done cscopelist-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist-recursive cscopelist cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(DATA) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(pkgconfigdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-pkgconfigDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-pkgconfigDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ cscopelist-recursive ctags-recursive install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-cscope \ clean-generic clean-libtool cscope cscopelist \ cscopelist-recursive ctags ctags-recursive dist dist-all \ dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ dist-xz \ dist-zip distcheck distclean distclean-generic distclean-hdr \ distclean-libtool distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgconfigDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-pkgconfigDATA test: @TEST_SCRIPTS_TRUE@ cd tests && $(MAKE) test @TEST_SCRIPTS_FALSE@ @echo Not built check: test # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libstatgrab-0.90/depcomp000555 001750 001750 00000056546 12200045540 015277 0ustar00tdbusers000000 000000 #! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2012-07-12.20; # UTC # Copyright (C) 1999-2012 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 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 . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # A tabulation character. tab=' ' # A newline character. nl=' ' if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' "$nl" < "$tmpdepfile" | ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependent.h'. # Do two passes, one to just change these to # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'. # However on # $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\': # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... # tcc 0.9.26 (FIXME still under development at the moment of writing) # will emit a similar output, but also prepend the continuation lines # with horizontal tabulation characters. "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form 'foo.o: dependent.h', # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'. # Do two passes, one to just change these to # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \ < "$tmpdepfile" > "$depfile" sed ' s/[ '"$tab"'][ '"$tab"']*/ /g s/^ *// s/ *\\*$// s/^[^:]*: *// /^$/d /:$/d s/$/ :/ ' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. base=`echo "$source" | sed -e 's|^.*/||' -e 's/\.[-_a-zA-Z0-9]*$//'` tmpdepfile="$base.d" # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir="$base.d-lock" trap "echo '$0: caught signal, cleaning up...' >&2; rm -rf $lockdir" 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0 ; do # mkdir is a portable test-and-set. if mkdir $lockdir 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rm -rf $lockdir break else ## the lock is being held by a different process, ## wait until the winning process is done or we timeout while test -d $lockdir && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test "$stat" = 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' "$nl" < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: libstatgrab-0.90/config.sub000644 001750 001750 00000105301 12200025312 015657 0ustar00tdbusers000000 000000 #! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-04-24' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 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 . # # 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 Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 \ | or1k | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or1k-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: libstatgrab-0.90/config.guess000644 001750 001750 00000130361 12200025312 016220 0ustar00tdbusers000000 000000 #! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-06-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 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 . # # 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 Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; or1k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: libstatgrab-0.90/Makefile.am000644 001750 001750 00000000750 12200025312 015735 0ustar00tdbusers000000 000000 # Makefile for libstatgrab # http://www.i-scream.org/libstatgrab/ # $Id$ AUTOMAKE_OPTIONS = gnu ACLOCAL_AMFLAGS = -I m4 DOCS_SUBDIR = docs if TESTS TESTS_SUBDIR = tests endif SUBDIRS = src examples $(DOCS_SUBDIR) $(TESTS_SUBDIR) test: if TEST_SCRIPTS cd tests && $(MAKE) test else @echo Not built endif check: test EXTRA_DIST = libstatgrab.pc.in PLATFORMS COPYING COPYING.LGPL MAINTAINERCLEANFILES = ChangeLog pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libstatgrab.pc libstatgrab-0.90/libstatgrab.pc.in000644 001750 001750 00000000477 12200025312 017136 0ustar00tdbusers000000 000000 # $Id$ prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ bin_owner=@BIN_OWNER@ bin_group=@BIN_GROUP@ bin_perm=@BIN_PERM@ Name: libstatgrab Description: Provides a useful interface to system statistics Version: @VERSION@ Libs: -L${libdir} -lstatgrab @LINKFLAGS@ Cflags: -I${includedir} libstatgrab-0.90/AUTHORS000644 001750 001750 00000000322 12200025312 014744 0ustar00tdbusers000000 000000 Peter Saunders Adam Sampson Tim Bishop Jens Rehsack All code is released under the GPL or LGPL. http://www.i-scream.org/libstatgrab/ libstatgrab-0.90/m4/000755 001750 001750 00000000000 12200045615 014227 5ustar00tdbusers000000 000000 libstatgrab-0.90/src/000755 001750 001750 00000000000 12200045615 014476 5ustar00tdbusers000000 000000 libstatgrab-0.90/README000644 001750 001750 00000003602 12200025312 014560 0ustar00tdbusers000000 000000 libstatgrab README http://www.i-scream.org/libstatgrab/ Description ----------- libstatgrab is a library for accessing information from the system for statistical purposes. It could be used for software that monitors the system for alerting or graphing purposes. License ------- The library part of libstatgrab is licensed under the GNU LGPL, but the tools and examples are licensed under the GNU GPL. Building and Installation ------------------------- After downloading and extracting libstatgrab, configure and build as follows; ./configure make Then install as root; make install There are, of course, the usual GNU-style configure options; --prefix=PREFIX For detailed documentation on the generic installation process, please read the INSTALL document. Enhancements of the general configuration process can be seen in the sections "Optional Features" and "Optional Packages" of the output of ./configure --help Prerequisites ------------- While libstatgrab will run without additional prerequisites, there are several options to improve it. * Having a recent (1.1.0+) version of log4cplus will enable tracing functionalities. log4cplus can be found on its homepage here; http://log4cplus.sourceforge.net/ Note that libstatgrab doesn't enable its logging automatically, the using applications must do it. * Manpages can be built automatically when docbook2x is installed. See http://docbook2x.sourceforge.net/ * On Linux it might be necessary to install the ncurses-dev (or equivalent) package to build saidar. Platform Specific Notes ----------------------- Please see the PLATFORMS file for supported platforms and specific notes on using libstatgrab on those platforms. Problems? --------- If you have any problems or find a bug, please let us know. We have information on how to do that on our website: http://www.i-scream.org/support.xhtml Thank you for using libstatgrab. libstatgrab-0.90/COPYING000644 001750 001750 00000043131 12200025312 014734 0ustar00tdbusers000000 000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. libstatgrab-0.90/ltmain.sh000444 001750 001750 00001054017 12200045532 015533 0ustar00tdbusers000000 000000 # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION=2.4.2 TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # 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. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # 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 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 case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug # FreeBSD-specific: where we install compilers with non-standard names tag_compilers_CC="*cc cc* *gcc gcc* clang" tag_compilers_CXX="*c++ c++* *g++ g++* clang++" base_compiler=`set -- "$@"; echo $1` # If $tagname isn't set, then try to infer if the default "CC" tag applies if test -z "$tagname"; then for zp in $tag_compilers_CC; do case $base_compiler in $zp) tagname="CC"; break;; esac done fi if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac # FreeBSD-specific: try compilers based on inferred tag if test -z "$tagname"; then eval "tag_compilers=\$tag_compilers_${z}" if test -n "$tag_compilers"; then for zp in $tag_compilers; do case $base_compiler in $zp) tagname=$z; break;; esac done if test -n "$tagname"; then break fi fi fi fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *-*-freebsd*) # FreeBSD doesn't need this... ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac deplibs="$deplibs $arg" continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" fi case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi ;; *) ;; esac # linkmode continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 libstatgrab-0.90/aclocal.m4000644 001750 001750 00000150616 12200045535 015561 0ustar00tdbusers000000 000000 # generated automatically by aclocal 1.12.6 -*- Autoconf -*- # Copyright (C) 1996-2012 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # longlong.m4 serial 14 dnl Copyright (C) 1999-2007, 2009-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Paul Eggert. # Define HAVE_LONG_LONG_INT if 'long long int' works. # This fixes a bug in Autoconf 2.61, but can be removed once we # assume 2.62 everywhere. # Note: If the type 'long long int' exists but is only 32 bits large # (as on some very old compilers), HAVE_LONG_LONG_INT will not be # defined. In this case you can treat 'long long int' like 'long int'. AC_DEFUN([AC_TYPE_LONG_LONG_INT], [ AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int], [AC_LINK_IFELSE( [_AC_TYPE_LONG_LONG_SNIPPET], [dnl This catches a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004. dnl If cross compiling, assume the bug isn't important, since dnl nobody cross compiles for this platform as far as we know. AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[@%:@include @%:@ifndef LLONG_MAX @%:@ define HALF \ (1LL << (sizeof (long long int) * CHAR_BIT - 2)) @%:@ define LLONG_MAX (HALF - 1 + HALF) @%:@endif]], [[long long int n = 1; int i; for (i = 0; ; i++) { long long int m = n << i; if (m >> i != n) return 1; if (LLONG_MAX / 2 < m) break; } return 0;]])], [ac_cv_type_long_long_int=yes], [ac_cv_type_long_long_int=no], [ac_cv_type_long_long_int=yes])], [ac_cv_type_long_long_int=no])]) if test $ac_cv_type_long_long_int = yes; then AC_DEFINE([HAVE_LONG_LONG_INT], [1], [Define to 1 if the system has the type `long long int'.]) fi ]) # Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works. # This fixes a bug in Autoconf 2.61, but can be removed once we # assume 2.62 everywhere. # Note: If the type 'unsigned long long int' exists but is only 32 bits # large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT # will not be defined. In this case you can treat 'unsigned long long int' # like 'unsigned long int'. AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT], [ AC_CACHE_CHECK([for unsigned long long int], [ac_cv_type_unsigned_long_long_int], [AC_LINK_IFELSE( [_AC_TYPE_LONG_LONG_SNIPPET], [ac_cv_type_unsigned_long_long_int=yes], [ac_cv_type_unsigned_long_long_int=no])]) if test $ac_cv_type_unsigned_long_long_int = yes; then AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1], [Define to 1 if the system has the type `unsigned long long int'.]) fi ]) # Expands to a C program that can be used to test for simultaneous support # of 'long long' and 'unsigned long long'. We don't want to say that # 'long long' is available if 'unsigned long long' is not, or vice versa, # because too many programs rely on the symmetry between signed and unsigned # integer types (excluding 'bool'). AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET], [ AC_LANG_PROGRAM( [[/* For now, do not test the preprocessor; as of 2007 there are too many implementations with broken preprocessors. Perhaps this can be revisited in 2012. In the meantime, code should not expect #if to work with literals wider than 32 bits. */ /* Test literals. */ long long int ll = 9223372036854775807ll; long long int nll = -9223372036854775807LL; unsigned long long int ull = 18446744073709551615ULL; /* Test constant expressions. */ typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll) ? 1 : -1)]; typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1 ? 1 : -1)]; int i = 63;]], [[/* Test availability of runtime routines for shift and division. */ long long int llmax = 9223372036854775807ll; unsigned long long int ullmax = 18446744073709551615ull; return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i) | (llmax / ll) | (llmax % ll) | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i) | (ullmax / ull) | (ullmax % ull));]]) ]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # PKG_INSTALLDIR(DIRECTORY) # ------------------------- # Substitutes the variable pkgconfigdir as the location where a module # should install pkg-config .pc files. By default the directory is # $libdir/pkgconfig, but the default can be changed by passing # DIRECTORY. The user can override through the --with-pkgconfigdir # parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ]) dnl PKG_INSTALLDIR # PKG_NOARCH_INSTALLDIR(DIRECTORY) # ------------------------- # Substitutes the variable noarch_pkgconfigdir as the location where a # module should install arch-independent pkg-config .pc files. By # default the directory is $datadir/pkgconfig, but the default can be # changed by passing DIRECTORY. The user can override through the # --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ]) dnl PKG_NOARCH_INSTALLDIR # PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, # [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # ------------------------------------------- # Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])# PKG_CHECK_VAR # PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, # [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], # [DESCRIPTION], [DEFAULT]) # # Prepare a "--with-" configure option using the lowercase [VARIABLE-PREFIX] # name, merging the behaviour of AC_ARG_WITH and PKG_CHECK_MODULES in a single # macro # # -------------------------------------------------------------- AC_DEFUN([PKG_WITH_MODULES], [ m4_pushdef([with_arg], m4_tolower([$1])) m4_pushdef([description], [m4_default([$5], [build with ]with_arg[ support])]) m4_pushdef([def_arg], [m4_default([$6], [auto])]) m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) m4_case(def_arg, [yes],[m4_pushdef([with_without], [--without-]with_arg)], [m4_pushdef([with_without],[--with-]with_arg)]) AC_ARG_WITH(with_arg, AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, [AS_TR_SH([with_]with_arg)=def_arg]) AS_CASE([$AS_TR_SH([with_]with_arg)], [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], [auto],[PKG_CHECK_MODULES([$1],[$2], [m4_n([def_action_if_found]) $3], [m4_n([def_action_if_not_found]) $4])]) m4_popdef([with_arg]) m4_popdef([description]) m4_popdef([def_arg]) ]) dnl PKG_WITH_MODULES # PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, # [DESCRIPTION], [DEFAULT]) # # Convenience macro to trigger AM_CONDITIONAL after # PKG_WITH_MODULES check. # # HAVE_[VARIABLE-PREFIX] is exported as make variable. # # -------------------------------------------------------------- AC_DEFUN([PKG_HAVE_WITH_MODULES], [ PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) AM_CONDITIONAL([HAVE_][$1], [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) ]) # PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, # [DESCRIPTION], [DEFAULT]) # # Convenience macro to run AM_CONDITIONAL and AC_DEFINE after # PKG_WITH_MODULES check. # # HAVE_[VARIABLE-PREFIX] is exported as make and preprocessor variable. # # -------------------------------------------------------------- AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], [ PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) ]) # Copyright (C) 2002-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.12' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.12.6], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.12.6])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # Copyright (C) 2011-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_AR([ACT-IF-FAIL]) # ------------------------- # Try to determine the archiver interface, and trigger the ar-lib wrapper # if it is needed. If the detection of archiver interface fails, run # ACT-IF-FAIL (default is to abort configure with a proper error message). AC_DEFUN([AM_PROG_AR], [AC_BEFORE([$0], [LT_INIT])dnl AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([ar-lib])dnl AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false]) : ${AR=ar} AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface], [am_cv_ar_interface=ar AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])], [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([am_ar_try]) if test "$ac_status" -eq 0; then am_cv_ar_interface=ar else am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([am_ar_try]) if test "$ac_status" -eq 0; then am_cv_ar_interface=lib else am_cv_ar_interface=unknown fi fi rm -f conftest.lib libconftest.a ]) ]) case $am_cv_ar_interface in ar) ;; lib) # Microsoft lib, so override with the ar-lib wrapper script. # FIXME: It is wrong to rewrite AR. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__AR in this case, # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something # similar. AR="$am_aux_dir/ar-lib $AR" ;; unknown) m4_default([$1], [AC_MSG_ERROR([could not determine $AR interface])]) ;; esac AC_SUBST([AR])dnl ]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated. For more info, see: http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_INIT_AUTOMAKE-invocation]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl dnl Support for Objective C++ was only introduced in Autoconf 2.65, dnl but we still cater to Autoconf 2.62. m4_ifdef([AC_PROG_OBJCXX], [AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The 'parallel-tests' driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2001-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of '-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/ax_lib.m4]) m4_include([m4/ax_ncurses.m4]) m4_include([m4/ax_perl5.m4]) m4_include([m4/ax_pthread.m4]) m4_include([m4/ax_shellvars.m4]) m4_include([m4/ax_types.m4]) m4_include([m4/ax_visibility.m4]) m4_include([m4/ax_win32.m4]) m4_include([m4/ax_xopen.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) libstatgrab-0.90/PLATFORMS000644 001750 001750 00000002104 12200025312 015166 0ustar00tdbusers000000 000000 libstatgrab PLATFORMS http://www.i-scream.org/libstatgrab/ Supported Platforms =================== libstatgrab-0.90 has been tested to work on the following platforms: DragonFly BSD 3.4 FreeBSD 7 FreeBSD 8 (i386, amd64) FreeBSD 9 (i386, amd64, sparc64, ia64) FreeBSD 10-CURRENT (i386, amd64, sparc64, ia64) HP-UX 11.11 (parisc) HP-UX 11.23 (parisc) HP-UX 11.23 (ia64) HP-UX 11.31 (ia64) Linux 2.6 (Ubuntu 10.04, SLES 9-11, Redhat 6, CentOS 6) Linux 3.X (Ubuntu 12.04) NetBSD 5.1 NetBSD 6.1 OpenBSD 4.9 OpenBSD 5.3 Solaris 8 (sparc & x86) Solaris 9 (sparc & x86) Solaris 10 (sparc & x86) AIX 5.2 AIX 5.3 AIX 6.1 Platform Specific Notes ======================= Unless explicitly mentioned below assume that libstatgrab will run on any of the platforms above without any elevated privileges. Linux ----- On older Linux kernels root privileges are required to get the statistics returned by the get_network_iface_stats function. Not having these privileges results in NULL being returned. Also note that this cannot be solved by calling sg_init and then sg_drop_privileges at this stage. libstatgrab-0.90/install-sh000555 001750 001750 00000033255 12200045540 015716 0ustar00tdbusers000000 000000 #!/bin/sh # install - install a program, script, or datafile scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: libstatgrab-0.90/config.h.in000644 001750 001750 00000062540 12200045537 015744 0ustar00tdbusers000000 000000 /* config.h.in. Generated from configure.ac by autoheader. */ /* Building on AIX 5.x - 9.x */ #undef AIX /* Building on some kind of BSD */ #undef ALLBSD /* Building on Cygwin */ #undef CYGWIN /* Building on Darwin */ #undef DARWIN /* Building on DragonFlyBSD */ #undef DFBSD /* Define if you want the thread support compiled in. */ #undef ENABLE_THREADS /* Define FMT string for gid_t */ #undef FMT_GID_T /* Define FMT string for pid_t */ #undef FMT_PID_T /* Define FMT string for size_t */ #undef FMT_SIZE_T /* Define FMT string for ssize_t */ #undef FMT_SSIZE_T /* Define FMT string for time_t */ #undef FMT_TIME_T /* Define FMT string for uid_t */ #undef FMT_UID_T /* Building on FreeBSD */ #undef FREEBSD /* Building on FreeBSD 5.x - 10.x */ #undef FREEBSD5 /* define when getmntent_r returns success code */ #undef GETMNTENT_R_RETURN_INT /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H /* Define to 1 if you have the header file. */ #undef HAVE_ASSERT_H /* Define to 1 if you have the `atoll' function. */ #undef HAVE_ATOLL /* Define to 1 if you have the `bzero' function. */ #undef HAVE_BZERO /* Define to 1 if you have the header file. */ #undef HAVE_CTYPE_H /* Define to 1 if you have the header file. */ #undef HAVE_CURSES_H /* define when endmntent() is declared */ #undef HAVE_DECL_ENDMNTENT /* Define to 1 if you have the declaration of `endutent', and to 0 if you don't. */ #undef HAVE_DECL_ENDUTENT /* Define to 1 if you have the declaration of `endutxent', and to 0 if you don't. */ #undef HAVE_DECL_ENDUTXENT /* define when F_SETLK is declared */ #undef HAVE_DECL_F_SETLK /* define when getargs() is declared properly */ #undef HAVE_DECL_GETARGS /* define when getprocs64() is declared properly */ #undef HAVE_DECL_GETPROCS64 /* Define to 1 if you have the declaration of `getutent', and to 0 if you don't. */ #undef HAVE_DECL_GETUTENT /* Define to 1 if you have the declaration of `getutxent', and to 0 if you don't. */ #undef HAVE_DECL_GETUTXENT /* define when mntctl() is declared properly */ #undef HAVE_DECL_MNTCTL /* define when setmntent() is declared */ #undef HAVE_DECL_SETMNTENT /* Define to 1 if you have the declaration of `setutent', and to 0 if you don't. */ #undef HAVE_DECL_SETUTENT /* Define to 1 if you have the declaration of `setutxent', and to 0 if you don't. */ #undef HAVE_DECL_SETUTXENT /* struct devstat.bytes array available */ #undef HAVE_DEVSTAT_BYTES /* struct devstat.bytes_read available */ #undef HAVE_DEVSTAT_BYTES_READ /* Define to 1 if you have the `devstat_getdevs' function. */ #undef HAVE_DEVSTAT_GETDEVS /* Define to 1 if you have the header file. */ #undef HAVE_DEVSTAT_H /* Define to 1 if you have the `devstat_selectdevs' function. */ #undef HAVE_DEVSTAT_SELECTDEVS /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* OpenBSD disk stats disk names */ #undef HAVE_DISKSTAT_DS_NAME /* New-style OpenBSD disk stats */ #undef HAVE_DISKSTAT_DS_RBYTES /* New-style NetBSD disk stats */ #undef HAVE_DISK_SYSCTL_DK_RBYTES /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the `endutent' function. */ #undef HAVE_ENDUTENT /* Define to 1 if you have the `endutxent' function. */ #undef HAVE_ENDUTXENT /* Define to 1 if you have the header file. */ #undef HAVE_ERRNO_H /* struct ethtool_cmd.speed_hi available */ #undef HAVE_ETHTOOL_CMD_SPEED_HI /* Define to 1 if you have the `fcntl' function. */ #undef HAVE_FCNTL /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_FLOAT_H /* Define to 1 if you have the `flock' function. */ #undef HAVE_FLOCK /* Define to 1 if you have the `getdevs' function. */ #undef HAVE_GETDEVS /* Define to 1 if you have the `getfsstat' function. */ #undef HAVE_GETFSSTAT /* Define to 1 if you have the `getloadavg' function. */ #undef HAVE_GETLOADAVG /* Define to 1 if you have the `getmntent' function. */ #undef HAVE_GETMNTENT /* Define to 1 if you have the `getmntent_r' function. */ #undef HAVE_GETMNTENT_R /* Define to 1 if you have the `getutent' function. */ #undef HAVE_GETUTENT /* Define to 1 if you have the `getutxent' function. */ #undef HAVE_GETUTXENT /* define when getvfsstat() is declared properly */ #undef HAVE_GETVFSSTAT /* Define to 1 if you have the `host_statistics' function. */ #undef HAVE_HOST_STATISTICS /* Define to 1 if you have the `host_statistics64' function. */ #undef HAVE_HOST_STATISTICS64 /* Define to 1 if you have the header file. */ #undef HAVE_IFADDRS_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_IO_H /* struct io_sysctl.name available */ #undef HAVE_IO_SYSCTL_NAME /* Define to 1 if you have the header file. */ #undef HAVE_IPHLPAPI_H /* Define to 1 if you have the `kinfo_get_sched_cputime' function. */ #undef HAVE_KINFO_GET_SCHED_CPUTIME /* Define to 1 if you have the header file. */ #undef HAVE_KINFO_H /* ki_stat member of struct kinfo_proc available */ #undef HAVE_KINFO_PROC_KI_STAT /* kp_eproc member of struct kinfo_proc available */ #undef HAVE_KINFO_PROC_KP_EPROC /* kp_eproc.e_ucred.cr_ruid member of struct kinfo_proc available */ #undef HAVE_KINFO_PROC_KP_EPROC_E_UCRED_CR_RUID /* kp_pid member of struct kinfo_proc available */ #undef HAVE_KINFO_PROC_KP_PID /* kp_proc member of struct kinfo_proc available */ #undef HAVE_KINFO_PROC_KP_PROC /* ki_structsize member of struct kinfo_proc available */ #undef HAVE_KINFO_PROC_KP_THREAD /* p_pid member of struct kinfo_proc available */ #undef HAVE_KINFO_PROC_P_PID /* p_stat member of struct kinfo_proc available */ #undef HAVE_KINFO_PROC_P_STAT /* p_vm_map_size member of struct kinfo_proc available */ #undef HAVE_KINFO_PROC_P_VM_MAP_SIZE /* Define to 1 if you have the header file. */ #undef HAVE_KSTAT_H /* Define to 1 if you have the header file. */ #undef HAVE_LIBDEVINFO_H /* Define to 1 if you have the header file. */ #undef HAVE_LIBGEN_H /* Define to 1 if you have the header file. */ #undef HAVE_LIBPERFSTAT_H /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_ETHTOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_SOCKIOS_H /* Define to 1 if you have the header file. */ #undef HAVE_LM_H /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H /* Define to 1 if the system has the type `long long int'. */ #undef HAVE_LONG_LONG_INT /* Define to 1 if you have the header file. */ #undef HAVE_MACH_HOST_INFO_H /* Define to 1 if you have the header file. */ #undef HAVE_MACH_KERN_RETURN_H /* Define to 1 if you have the header file. */ #undef HAVE_MACH_MACHINE_H /* Define to 1 if you have the header file. */ #undef HAVE_MACH_MACH_H /* Define to 1 if you have the header file. */ #undef HAVE_MACH_MACH_HOST_H /* Define to 1 if you have the header file. */ #undef HAVE_MACH_VM_STATISTICS_H /* Define to 1 if you have the `malloc' function. */ #undef HAVE_MALLOC /* Define to 1 if you have the header file. */ #undef HAVE_MATH_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `mntctl' function. */ #undef HAVE_MNTCTL /* Define to 1 if you have the header file. */ #undef HAVE_MNTENT_H /* Define to 1 if you have the header file. */ #undef HAVE_NCURSES_H /* Define to 1 if you have the header file. */ #undef HAVE_NCURSES_NCURSES_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IF_ETHER_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if you have the header file. */ #undef HAVE_NET_IF_H /* Define to 1 if you have the header file. */ #undef HAVE_NET_IF_MEDIA_H /* define this when array at struct end might be open */ #undef HAVE_OPEN_ARRAY_AT_STRUCT_END /* Define to 1 if you have the header file. */ #undef HAVE_PATHS_H /* Define to 1 if you have the header file. */ #undef HAVE_PDH_H /* Define to 1 if you have the header file. */ #undef HAVE_PROCESS_H /* Define to signal that procfs is available */ #undef HAVE_PROCFS /* Define to 1 if you have the header file. */ #undef HAVE_PROCFS_H /* Define to 1 if you have the header file. */ #undef HAVE_PROCINFO_H /* Define to 1 if you have the header file. */ #undef HAVE_PSAPI_H /* pst_diskinfo.psd_dkbytewrite */ #undef HAVE_PST_DISKINFO_PSD_DKBYTEWRITE /* Define if you have POSIX threads libraries and header files. */ #undef HAVE_PTHREAD /* Define to 1 if you have the header file. */ #undef HAVE_PTHREAD_H /* Define to 1 if you have the `realloc' function. */ #undef HAVE_REALLOC /* Define to 1 if you have the header file. */ #undef HAVE_REGEX_H /* Define to 1 if you have the header file. */ #undef HAVE_SCHED_H /* Define to 1 if you have the `selectdevs' function. */ #undef HAVE_SELECTDEVS /* Define to 1 if you have the `setegid' function. */ #undef HAVE_SETEGID /* Define to 1 if you have the `seteuid' function. */ #undef HAVE_SETEUID /* Define to 1 if you have the header file. */ #undef HAVE_SETJMP_H /* Define to 1 if you have the `setresgid' function. */ #undef HAVE_SETRESGID /* Define to 1 if you have the `setresuid' function. */ #undef HAVE_SETRESUID /* Define to 1 if you have the `setutent' function. */ #undef HAVE_SETUTENT /* Define to 1 if you have the `setutxent' function. */ #undef HAVE_SETUTXENT /* Define to 1 if you have the header file. */ #undef HAVE_SIGNAL_H /* Define to 1 if you have the `statfs' function. */ #undef HAVE_STATFS /* define when statfs has f_favail member */ #undef HAVE_STATFS_FFAVAIL /* define when statfs has f_frsize member */ #undef HAVE_STATFS_FFRSIZE /* define when statfs has f_iosize member */ #undef HAVE_STATFS_FIOSIZE /* Define to 1 if you have the `statvfs' function. */ #undef HAVE_STATVFS /* Define to 1 if you have the `statvfs64' function. */ #undef HAVE_STATVFS64 /* Solaris etc. extended statvfs64 */ #undef HAVE_STATVFS64_FBASETYPE /* another Solaris extension */ #undef HAVE_STATVFS64_FFRSIZE /* another BSD extension */ #undef HAVE_STATVFS64_FIOSIZE /* NetBSD extended statvfs64 */ #undef HAVE_STATVFS64_FSTYPENAME /* Solaris etc. extended statvfs */ #undef HAVE_STATVFS_FBASETYPE /* another Solaris extension */ #undef HAVE_STATVFS_FFRSIZE /* another BSD extension */ #undef HAVE_STATVFS_FIOSIZE /* NetBSD extended statvfs */ #undef HAVE_STATVFS_FSTYPENAME /* Define to 1 if you have the header file. */ #undef HAVE_STDARG_H /* Define to 1 if you have the header file. */ #undef HAVE_STDDEF_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strerror_r' function. */ #undef HAVE_STRERROR_R /* Define to 1 if you have the `strerror_s' function. */ #undef HAVE_STRERROR_S /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strncpy' function. */ #undef HAVE_STRNCPY /* Define to 1 if you have the `strndup' function. */ #undef HAVE_STRNDUP /* Define to 1 if you have the `strnlen' function. */ #undef HAVE_STRNLEN /* Define to 1 if the system has the type `struct anoninfo'. */ #undef HAVE_STRUCT_ANONINFO /* Define to 1 if the system has the type `struct devstat'. */ #undef HAVE_STRUCT_DEVSTAT /* Define to 1 if the system has the type `struct diskstats'. */ #undef HAVE_STRUCT_DISKSTATS /* Define to 1 if the system has the type `struct disk_sysctl'. */ #undef HAVE_STRUCT_DISK_SYSCTL /* Define to 1 if the system has the type `struct io_sysctl'. */ #undef HAVE_STRUCT_IO_SYSCTL /* Define to 1 if the system has the type `struct kinfo_cputime'. */ #undef HAVE_STRUCT_KINFO_CPUTIME /* Define to 1 if the system has the type `struct kinfo_proc'. */ #undef HAVE_STRUCT_KINFO_PROC /* Define to 1 if the system has the type `struct kinfo_proc2'. */ #undef HAVE_STRUCT_KINFO_PROC2 /* Define to 1 if the system has the type `struct mntent'. */ #undef HAVE_STRUCT_MNTENT /* Define to 1 if the system has the type `struct mnttab'. */ #undef HAVE_STRUCT_MNTTAB /* Define to 1 if `ss_family' is a member of `struct sockaddr_storage'. */ #undef HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY /* Define to 1 if `__ss_family' is a member of `struct sockaddr_storage'. */ #undef HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY /* Define to 1 if the system has the type `struct statfs'. */ #undef HAVE_STRUCT_STATFS /* Define to 1 if the system has the type `struct statinfo'. */ #undef HAVE_STRUCT_STATINFO /* Define to 1 if the system has the type `struct statvfs'. */ #undef HAVE_STRUCT_STATVFS /* Define to 1 if the system has the type `struct statvfs64'. */ #undef HAVE_STRUCT_STATVFS64 /* Define to 1 if the system has the type `struct swapent'. */ #undef HAVE_STRUCT_SWAPENT /* Define to 1 if the system has the type `struct swaptable'. */ #undef HAVE_STRUCT_SWAPTABLE /* Define to 1 if the system has the type `struct utmp'. */ #undef HAVE_STRUCT_UTMP /* Define to 1 if the system has the type `struct utmpx'. */ #undef HAVE_STRUCT_UTMPX /* Define to 1 if the system has the type `struct uvmexp'. */ #undef HAVE_STRUCT_UVMEXP /* struct uvmexp.execpages */ #undef HAVE_STRUCT_UVMEXP_EXECPAGES /* struct uvmexp.filepages */ #undef HAVE_STRUCT_UVMEXP_FILEPAGES /* struct uvmexp.swtch */ #undef HAVE_STRUCT_UVMEXP_SWTCH /* Define to 1 if the system has the type `struct uvmexp_sysctl'. */ #undef HAVE_STRUCT_UVMEXP_SYSCTL /* Define to 1 if the system has the type `struct vfsconf'. */ #undef HAVE_STRUCT_VFSCONF /* Define to 1 if the system has the type `struct vmmeter'. */ #undef HAVE_STRUCT_VMMETER /* Define to 1 if the system has the type `struct vmtotal'. */ #undef HAVE_STRUCT_VMTOTAL /* Define to 1 if the system has the type `struct xswdev'. */ #undef HAVE_STRUCT_XSWDEV /* struct xswdev.xsw_size */ #undef HAVE_STRUCT_XSWDEV_SIZE /* Define to 1 if the system has the type `struct xsw_usage'. */ #undef HAVE_STRUCT_XSW_USAGE /* Define to 1 if the system has the type `struct xvfsconf'. */ #undef HAVE_STRUCT_XVFSCONF /* Define to 1 if you have the `sysctlbyname' function. */ #undef HAVE_SYSCTLBYNAME /* Define to 1 if you have the `sysfs' function. */ #undef HAVE_SYSFS /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_DISK_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_DKSTAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_DK_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_DLPI_EXT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_DLPI_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_DR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FSTYP_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOSTAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_LOADAVG_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MIB_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MNTCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MNTTAB_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MNTTENT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MOUNT_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PROC_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PROTOSW_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PSTAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_RESOURCE_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SAR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SCHED_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKIO_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STATFS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STATVFS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STROPTS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SWAP_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SYSCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SYSINFO_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SYSTEMINFO_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TERMIOS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UCRED_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UNISTD_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UN_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_USER_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UTSNAME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_VFS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_VMMETER_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_VMOUNT_H /* Define to 1 if you have the header file. */ #undef HAVE_TERMIOS_H /* define when getmntent takes pointer to storage to fill */ #undef HAVE_THREADSAFE_GETMNTENT /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if the system has the type `unsigned long long int'. */ #undef HAVE_UNSIGNED_LONG_LONG_INT /* utmp */ #undef HAVE_UTMP /* utmpx */ #undef HAVE_UTMPX /* Define to 1 if you have the header file. */ #undef HAVE_UTMPX_H /* utmpx.ut_host */ #undef HAVE_UTMPX_HOST /* utmpx.ut_syslen */ #undef HAVE_UTMPX_SYSLEN /* Define to 1 if you have the header file. */ #undef HAVE_UTMP_H /* utmp.ut_host */ #undef HAVE_UTMP_HOST /* utmp.ut_id */ #undef HAVE_UTMP_ID /* utmp.ut_name */ #undef HAVE_UTMP_NAME /* utmp.ut_pid */ #undef HAVE_UTMP_PID /* utmp.ut_time */ #undef HAVE_UTMP_TIME /* utmp.ut_type */ #undef HAVE_UTMP_TYPE /* utmp.ut_user */ #undef HAVE_UTMP_USER /* Define to 1 if you have the header file. */ #undef HAVE_UVM_UVM_H /* Define to 1 if you have the header file. */ #undef HAVE_VM_VM_PARAM_H /* Define to 1 if you have the `vsnprintf' function. */ #undef HAVE_VSNPRINTF /* Define to 1 if you have the `vsprintf' function. */ #undef HAVE_VSPRINTF /* Define to 1 if you have the header file. */ #undef HAVE_WINSOCK2_H /* Define to 1 if you have the header file. */ #undef HAVE_WINSOCK_H /* Define to 1 if you have the header file. */ #undef HAVE_WS2TCPIP_H /* Define to 1 if you have the header file. */ #undef HAVE_WSPIAPI_H /* _XOPEN_SOURCE $HAVE_XOPEN_SOURCE */ #undef HAVE_XOPEN_SOURCE /* define this when array can have zero length */ #undef HAVE_ZERO_SIZED_ARRAY /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Building on HP-UX 11.11+ */ #undef HPUX /* Building on HP-UX 11.11+ */ #undef HPUX11 /* Building on GNU/Linux */ #undef LINUX /* define when linux/ethtool.h has broken types */ #undef LINUX_BROKEN_ETHTOOL_TYPES /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Building on MinGW */ #undef MINGW /* Configure determined mtab file */ #undef MNT_MNTTAB /* Define to 1 if PTHREAD_ONCE_INIT needs braces. */ #undef NEED_PTHREAD_MUTEX_INITIALIZER_BRACES /* Define to 1 if PTHREAD_ONCE_INIT needs braces. */ #undef NEED_PTHREAD_ONCE_INIT_BRACES /* Building on NetBSD */ #undef NETBSD /* Building on OpenBSD */ #undef OPENBSD /* Define to be the name of the operating system. */ #undef OS_TYPE /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to necessary symbol if this constant uses a non-standard name on your system. */ #undef PTHREAD_CREATE_JOINABLE /* The size of `utmpx.ut_id', as computed by sizeof. */ #undef SIZEOF_UTMPX_UT_ID /* The size of `utmp.ut_id', as computed by sizeof. */ #undef SIZEOF_UTMP_UT_ID /* Building on Solaris */ #undef SOLARIS /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* define when strerror_r returns success code */ #undef STRERROR_R_RETURN_INT /* Defined with a true value when struct sg_vector is well aligned */ #undef STRUCT_SG_VECTOR_ALIGN_OK /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Version number of package */ #undef VERSION /* Building for Windows 2000 */ #undef WINVER /* Define this when tracing shall be done using fprintf(stderr, ...) */ #undef WITH_FULL_CONSOLE_LOGGER /* Define this when tracing shall be done using log4cplus */ #undef WITH_LIBLOG4CPLUS /* Define for Solaris 2.5.1 so the uint32_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT32_T /* Define for Solaris 2.5.1 so the uint64_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT64_T /* Define for Solaris 2.5.1 so the uint8_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT8_T /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `int' if doesn't define. */ #undef gid_t /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to the type of a signed integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ #undef int16_t /* Define to the type of a signed integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef int32_t /* Define to the type of a signed integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef int64_t /* Define to the type of a signed integer type of width exactly 8 bits if such a type exists and the standard includes do not define it. */ #undef int8_t /* Define to `long int' if does not define. */ #undef off_t /* Define to `int' if does not define. */ #undef pid_t /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to `int' if does not define. */ #undef ssize_t /* Define to `long int' if does not define. */ #undef time_t /* Define to `int' if doesn't define. */ #undef uid_t /* Define to the type of an unsigned integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ #undef uint16_t /* Define to the type of an unsigned integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef uint32_t /* Define to the type of an unsigned integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef uint64_t /* Define to the type of an unsigned integer type of width exactly 8 bits if such a type exists and the standard includes do not define it. */ #undef uint8_t libstatgrab-0.90/tests/000755 001750 001750 00000000000 12200045621 015046 5ustar00tdbusers000000 000000 libstatgrab-0.90/COPYING.LGPL000644 001750 001750 00000063476 12200025312 015507 0ustar00tdbusers000000 000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This 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. This 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 this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! libstatgrab-0.90/configure.ac000644 001750 001750 00000133526 12200025312 016177 0ustar00tdbusers000000 000000 # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. # # configure.in for libstatgrab # $Id$ # # Might work with older autoconfs... but tested on 2.57 AC_PREREQ([2.69]) # Change these to change the package name and version AC_INIT([libstatgrab],[0.90],[https://github.com/i-scream/libstatgrab/issues],,[http://www.i-scream.org/libstatgrab/]) AC_CONFIG_SRCDIR([src/libstatgrab/cpu_stats.c]) AM_INIT_AUTOMAKE() AC_CONFIG_MACRO_DIR([m4]) AM_INIT_AUTOMAKE([foreign -Wall -Werror]) # The file we use to pass #define's to the source AC_CONFIG_HEADERS([config.h]) AM_MAINTAINER_MODE([disable]) # Revision number (automatically updated) AC_REVISION($Revision$) dnl dnl Get cannonical host - the only one of build/host/target we care about dnl build is where we build, host the the machine we build for dnl AC_CANONICAL_HOST dnl and store it for generic error message instead of lots of ifdef's AC_DEFINE_UNQUOTED([OS_TYPE], "$host_os", [Define to be the name of the operating system.]) dnl AM_CONFIG_HEADER([config.h]) dnl disable unnecessary compiler checks AC_DEFUN([AC_PROG_F77], [:]) AC_DEFUN([AC_PROG_FC], [:]) AC_DEFUN([AC_PROG_OBJC], [:]) AC_DEFUN([AC_PROG_OBJCCPP], [:]) AC_DEFUN([AC_LIBTOOL_F77], [:]) dnl disable check for GNU compatible malloc - just a working malloc is enough AC_DEFUN([AC_FUNC_MALLOC_IF], [:]) AC_DEFUN([AC_FUNC_MALLOC], [ AC_CHECK_FUNCS([malloc realloc]) ]) # Checks for programs AC_PROG_CC AC_PROG_CC_C99 AC_PROG_CXX AC_PROG_INSTALL AC_PROG_SED AC_PROG_GREP AM_PROG_AR # define default language AC_LANG([C]) # Checks for standard C header files AC_HEADER_STDC AC_HEADER_TIME AC_CHECK_HEADER_STDBOOL AS_IF([test "x$ac_cv_header_stdc" != "xyes"], [ AC_CHECK_HEADERS([assert.h ctype.h errno.h float.h limits.h locale.h math.h setjmp.h signal.h stdarg.h stddef.h stdlib.h string.h]) ]) ac_includes_default="\ ${ac_includes_default} #ifndef __cplusplus # ifdef HAVE_STDBOOL_H # include # endif #endif" # Checks for typedefs, structures, and compiler characteristics AC_C_CONST AC_C_INLINE AC_TYPE_INT8_T AC_TYPE_INT16_T AC_TYPE_INT32_T AC_TYPE_INT64_T AC_TYPE_UINT8_T AC_TYPE_UINT16_T AC_TYPE_UINT32_T AC_TYPE_UINT64_T AC_TYPE_SIZE_T AC_TYPE_SSIZE_T AC_TYPE_OFF_T AC_TYPE_PID_T AC_TYPE_UID_T AC_TYPE_GID_T AC_TYPE_TIME_T AC_TYPE_LONG_LONG_INT AC_TYPE_UNSIGNED_LONG_LONG_INT dnl Check for extra flags to enable some kind of behavior AC_CHECK_DECL([_AIX],[ac_cv_need_minus_d_linux_source_compat="yes"; ac_cv_need_minus_d_all_source="yes"]) AC_CHECK_DECL([__linux],[ac_cv_need_minus_d_gnu_source="yes"]) dnl probably required by kfreebsd, too? AC_CHECK_DECL([__sun],[ac_cv_need_minus_d_extensions="yes"; ac_cv_need_minus_d_posix_pthread_semantics="yes"]) AC_CHECK_DECL([__hpux],[ac_cv_need_minus_d_hpux_source="yes"]) AS_IF([test "x$ac_cv_need_minus_d_linux_source_compat" = "xyes"], [CPPFLAGS="$CPPFLAGS -D_LINUX_SOURCE_COMPAT"]) AS_IF([test "x$ac_cv_need_minus_d_gnu_source" = "xyes"], [CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"]) AS_IF([test "x$ac_cv_need_minus_d_all_source" = "xyes"], [CPPFLAGS="$CPPFLAGS -D_ALL_SOURCE"]) AS_IF([test "x$ac_cv_need_minus_d_extensions" = "xyes"], [CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__"]) AS_IF([test "x$ac_cv_need_minus_d_posix_pthread_semantics" = "xyes"], [CPPFLAGS="$CPPFLAGS -D_POSIX_PTHREAD_SEMANTICS"]) AS_IF([test "x$ac_cv_need_minus_d_hpux_source" = "xyes"], [CPPFLAGS="$CPPFLAGS -D_HPUX_SOURCE"]) dnl check language / compatibility environment AX_CHECK_XOPEN_SOURCE AS_IF([test -n "$XOPEN_SOURCE_CPPFLAGS"], [CPPFLAGS="$CPPFLAGS $XOPEN_SOURCE_CPPFLAGS"]) dnl Checks for inet libraries: AC_SEARCH_LIBS(gethostent, [nsl]) AC_SEARCH_LIBS(setsockopt, [socket net network]) dnl AC_SEARCH_LIBS(connect, [inet]) # Checks for library functions AC_FUNC_MALLOC AC_FUNC_GETMNTENT AC_CHECK_FUNCS([atoll bzero fcntl flock getloadavg getmntent getmntent_r seteuid setegid setresuid setresgid statfs statvfs statvfs64 strerror_r strndup strnlen vsprintf vsnprintf]) # Check for some additional headers AC_CHECK_HEADERS([fcntl.h inttypes.h libgen.h limits.h netdb.h regex.h sched.h signal.h stdint.h sys/ioctl.h sys/socket.h sys/statvfs.h sys/unistd.h]) AC_CHECK_DECL([F_SETLK], [AC_DEFINE([HAVE_DECL_F_SETLK], 1, [define when F_SETLK is declared])], ,[ AC_INCLUDES_DEFAULT #ifdef HAVE_FCNTL_H # include #endif #ifdef HAVE_SYS_FCNTL_H # include #endif #ifdef HAVE_SYS_FILE_H # include #endif ]) AX_WIN32( [ AC_CHECK_HEADERS([io.h Iphlpapi.h lm.h pdh.h process.h psapi.h winsock2.h ws2tcpip.h wspiapi.h winsock.h]) AC_CHECK_FUNCS([strerror_s]) ], [ dnl else AC_HEADER_DIRENT AC_CHECK_HEADERS([libdevinfo.h mach/machine.h mntent.h paths.h sys/fstyp.h sys/loadavg.h sys/mnttent.h sys/mnttab.h sys/un.h sys/utsname.h sys/vfs.h utmp.h utmpx.h]) AC_CHECK_HEADERS([sys/param.h sys/mount.h sys/proc.h sys/swap.h sys/sysctl.h sys/systeminfo.h sys/user.h], , , [ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H #include #endif ]) AC_CHECK_HEADERS([arpa/inet.h netinet/in.h net/if.h netinet/if_ether.h], , , [ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_SOCKET_H # include #endif #if HAVE_NETINET_IN_H # include #endif #ifdef HAVE_NETDB_H # include #endif #ifdef HAVE_ARPA_INET_H # include #endif ]) AC_CHECK_HEADERS([sys/sar.h sys/sysinfo.h], , , [ AC_INCLUDES_DEFAULT #if HAVE_SYS_SAR_H # include #endif ]) AC_CHECK_FUNCS([strncpy]) ] ) AS_CASE([$host_os], [solaris2.[[7-9]]*], [ENABLE_DIRECT_TYPE_FMT_SEARCH_DEFAULT="size_t ssize_t"] [hpux11.11], [ENABLE_DIRECT_TYPE_FMT_SEARCH_DEFAULT="size_t ssize_t"] [ENABLE_DIRECT_TYPE_FMT_SEARCH_DEFAULT=]) AX_ENABLE_DIECT_TYPE_FMT_SEARCH([$ENABLE_DIRECT_TYPE_FMT_SEARCH_DEFAULT]) AX_CHECK_TYPES_FMT([pid_t uid_t gid_t time_t]) AX_CHECK_TYPE_FMT([size_t], [%zu]) AX_CHECK_TYPE_FMT([ssize_t], [%zd]) AX_CHECK_ALIGNOF([struct sg_vector], [AC_INCLUDES_DEFAULT struct sg_vector_init_info { size_t item_size; void * init_fn; void * copy_fn; void * compute_diff_fn; void * compare_fn; void * destroy_fn; }; #ifndef NDEBUG struct sg_vector { size_t start_eye; size_t used_count; size_t alloc_count; size_t block_shift; struct sg_vector_init_info info; size_t final_eye; }; #else struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; struct sg_vector_init_info info; }; #endif ]) AC_CACHE_CHECK([for unspecified array size for last struct member], ac_cv_unspecified_size_last_struct_member, [ AC_COMPILE_IFELSE([AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT struct foobar { char *nm; unsigned nums[[]]; }; int main(void) { struct foobar *fbs; return 0; }])], [ac_cv_unspecified_size_last_struct_member="yes"], [ac_cv_unspecified_size_last_struct_member="no"]) ]) AS_IF([test "x$ac_cv_unspecified_size_last_struct_member" = "xyes"], [AC_DEFINE([HAVE_OPEN_ARRAY_AT_STRUCT_END], 1, [define this when array at struct end might be open])]) AC_CACHE_CHECK([for array length of 0], ac_cv_zero_array_size, [ AC_COMPILE_IFELSE([AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT struct foobar { char *nm; unsigned nums[[0]]; }; int main(void) { struct foobar *fbs; return 0; }])], [ac_cv_zero_array_size="yes"], [ac_cv_zero_array_size="no"]) ]) AS_IF([test "x$ac_cv_zero_array_size" = "xyes"], [AC_DEFINE([HAVE_ZERO_SIZED_ARRAY], 1, [define this when array can have zero length])]) AC_CHECK_TYPES([struct statvfs], , , [ AC_INCLUDES_DEFAULT #include ]) AS_IF([test "x$ac_cv_type_struct_statvfs" = "xyes"], [ # NetBSD 2.0 provides extended statvfs AC_CHECK_MEMBER(struct statvfs.f_fstypename, [AC_DEFINE(HAVE_STATVFS_FSTYPENAME, , [NetBSD extended statvfs])], [], [ AC_INCLUDES_DEFAULT #include ]) # Solaris, HP-UX and AIX, too - but other extension AC_CHECK_MEMBER(struct statvfs.f_basetype, [AC_DEFINE(HAVE_STATVFS_FBASETYPE, , [Solaris etc. extended statvfs])], [], [ AC_INCLUDES_DEFAULT #include ]) AC_CHECK_MEMBER(struct statvfs.f_iosize, [AC_DEFINE(HAVE_STATVFS_FIOSIZE, , [another BSD extension])], [], [ AC_INCLUDES_DEFAULT #include ]) AC_CHECK_MEMBER(struct statvfs.f_frsize, [AC_DEFINE(HAVE_STATVFS_FFRSIZE, , [another Solaris extension])], [], [ AC_INCLUDES_DEFAULT #include ]) AC_CHECK_TYPES([struct statvfs64], , , [ AC_INCLUDES_DEFAULT #include ]) AS_IF([test "x$ac_cv_type_struct_statvfs64" = "xyes"], [ # NetBSD 2.0 provides extended statvfs - does anyone copy this to an statvfs64? AC_CHECK_MEMBER(struct statvfs64.f_fstypename, [AC_DEFINE(HAVE_STATVFS64_FSTYPENAME, , [NetBSD extended statvfs64])], [], [ AC_INCLUDES_DEFAULT #include ]) # Solaris, HP-UX and AIX, too - but other extension AC_CHECK_MEMBER(struct statvfs64.f_basetype, [AC_DEFINE(HAVE_STATVFS64_FBASETYPE, , [Solaris etc. extended statvfs64])], [], [ AC_INCLUDES_DEFAULT #include ]) AC_CHECK_MEMBER(struct statvfs64.f_iosize, [AC_DEFINE(HAVE_STATVFS64_FIOSIZE, , [another BSD extension])], [], [ AC_INCLUDES_DEFAULT #include ]) AC_CHECK_MEMBER(struct statvfs64.f_frsize, [AC_DEFINE(HAVE_STATVFS64_FFRSIZE, , [another Solaris extension])], [], [ AC_INCLUDES_DEFAULT #include ]) ]) ]) AC_CHECK_FUNCS([sysfs]) AS_IF([test "x$ac_cv_header_utmpx_h" = "xyes"], [ AC_CHECK_FUNCS([getutxent setutxent endutxent]) AC_CHECK_DECLS([getutxent, setutxent, endutxent], , , [AC_INCLUDES_DEFAULT() #include ]) # FreeBSD 9 (and others) uses utmpx rather than utmp AC_CHECK_TYPES([struct utmpx], , , [#include ]) AC_CHECK_MEMBER(struct utmpx.ut_type, [AC_DEFINE(HAVE_UTMPX, , [utmpx])], [], [#include ]) # Some OS support ut_host, too AC_CHECK_MEMBER(struct utmpx.ut_host, [AC_DEFINE(HAVE_UTMPX_HOST, , [utmpx.ut_host])], [], [#include ]) # ... or have a "significant length of ut_host" AC_CHECK_MEMBER(struct utmpx.ut_syslen, [AC_DEFINE(HAVE_UTMPX_SYSLEN, , [utmpx.ut_syslen])], [], [#include ]) AC_CHECK_SIZEOF([utmpx.ut_id], ,[#include ]) ]) AS_IF([test "x$ac_cv_header_utmp_h" = "xyes"], [ AC_CHECK_FUNCS([setutent endutent getutent]) AC_CHECK_DECLS([getutent, setutent, endutent], , , [AC_INCLUDES_DEFAULT() #include ]) AC_CHECK_TYPES([struct utmp], , , [ AC_INCLUDES_DEFAULT #include ] ) AC_CHECK_MEMBER(struct utmp.ut_line, [AC_DEFINE(HAVE_UTMP, , [utmp])], [], [ AC_INCLUDES_DEFAULT #include ] ) AC_CHECK_MEMBER(struct utmp.ut_type, [AC_DEFINE(HAVE_UTMP_TYPE, , [utmp.ut_type])], [], [ AC_INCLUDES_DEFAULT #include ] ) AC_CHECK_MEMBER(struct utmp.ut_name, [AC_DEFINE(HAVE_UTMP_NAME, , [utmp.ut_name])], [], [ AC_INCLUDES_DEFAULT #include ] ) AC_CHECK_MEMBER(struct utmp.ut_user, [AC_DEFINE(HAVE_UTMP_USER, , [utmp.ut_user])], [], [ AC_INCLUDES_DEFAULT #include ] ) AC_CHECK_MEMBER(struct utmp.ut_host, [AC_DEFINE(HAVE_UTMP_HOST, , [utmp.ut_host])], [], [ AC_INCLUDES_DEFAULT #include ] ) AC_CHECK_MEMBER(struct utmp.ut_pid, [AC_DEFINE(HAVE_UTMP_PID, , [utmp.ut_pid])], [], [ AC_INCLUDES_DEFAULT #include ] ) AC_CHECK_MEMBER(struct utmp.ut_id, [AC_DEFINE(HAVE_UTMP_ID, , [utmp.ut_id])], [], [ AC_INCLUDES_DEFAULT #include ] ) AC_CHECK_MEMBER(struct utmp.ut_time, [AC_DEFINE(HAVE_UTMP_TIME, , [utmp.ut_time])], [], [ AC_INCLUDES_DEFAULT #include ] ) AC_CHECK_SIZEOF([utmp.ut_id], , [ AC_INCLUDES_DEFAULT #include ] ) ]) ax_include_sockets="\ #if HAVE_WINSOCK2_H # include # if HAVE_WS2TCPIP_H # include # endif # if HAVE_WSPIAPI_H # include # endif #elif HAVE_WINSOCK_H /* IIRC winsock.h must be included before windows.h */ # include #else # ifdef HAVE_NETDB_H # include # endif # if HAVE_SYS_TYPES_H # include # endif # ifdef HAVE_SYS_SOCKET_H # include # endif # ifdef HAVE_NETINET_IN_H # include # endif # ifdef HAVE_ARPA_INET_H # include # endif #endif" AC_CHECK_MEMBERS([struct sockaddr_storage.ss_family, struct sockaddr_storage.__ss_family], [], [], [ AC_INCLUDES_DEFAULT $ax_include_sockets ]) # Default needing setgid/setuid to false AM_CONDITIONAL(SETGIDBINS, false) AM_CONDITIONAL(SETUIDBINS, false) # Default MINGW setting AM_CONDITIONAL(MINGW, false) ENABLE_THREADS_DEFAULT="check" # Set things up for different OS's # We define the name of the OS so the code can act accordingly # We also need to add the right LDFLAGS AS_CASE([$host_os], [solaris*], [ AC_CHECK_HEADERS([kstat.h libdevinfo.h procfs.h sys/sockio.h]) AC_DEFINE(SOLARIS, 1, [Building on Solaris]) AM_CONDITIONAL(SETUIDBINS, true) BIN_OWNER="root" BIN_PERM="4755" AC_CHECK_LIB(kstat, kstat_open, [LINKFLAGS="$LINKFLAGS -lkstat"],[AC_MSG_ERROR([need libkstat])]) AC_CHECK_LIB(devinfo, di_init, [LINKFLAGS="$LINKFLAGS -ldevinfo"]) AC_CHECK_LIB(m, fabs, [SAIDARLIBS="$SAIDARLIBS -lm"]) dnl check whether procfs is really available AC_DEFINE(HAVE_PROCFS, 1, [Define to signal that procfs is available]) AC_CHECK_TYPES([struct swapent, struct swaptable, struct anoninfo], , , [ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_SWAP_H # include #endif ]) ac_cv_threadsafe_strerror="yes" ], [hpux11.11*|hpux11.[[23]]*], [ AC_DEFINE(HPUX, , [Building on HP-UX 11.11+]) AC_DEFINE(HPUX11, , [Building on HP-UX 11.11+]) AC_CHECK_HEADERS([sys/pstat.h],,[AC_MSG_ERROR(need sys/pstat.h)]) AC_CHECK_HEADERS([sys/dk.h sys/dlpi.h sys/dlpi_ext.h sys/mib.h sys/stropts.h]) CPPFLAGS="$CPPFLAGS -D_PSTAT64" ac_cv_threadsafe_strerror="yes" ac_cv_threadsafe_getmntent="yes" AC_CHECK_MEMBER(struct pst_diskinfo.psd_dkbytewrite, [AC_DEFINE(HAVE_PST_DISKINFO_PSD_DKBYTEWRITE, , [pst_diskinfo.psd_dkbytewrite])], [], [#include ]) AC_CHECK_LIB(m, fabs, [SAIDARLIBS="$SAIDARLIBS -lm"]) ], [aix*], [ AC_DEFINE(AIX, , [Building on AIX 5.x - 9.x]) AC_CHECK_LIB(perfstat, perfstat_cpu_total, [LINKFLAGS="$LINKFLAGS -lperfstat"], [need libperfstat]) AC_CHECK_HEADERS([sys/dr.h sys/protosw.h libperfstat.h procinfo.h sys/mntctl.h sys/statfs.h sys/vmount.h], , ,[ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_DR_H #include #endif #ifdef HAVE_SYS_PROTOSW_H #include #endif ]) AC_CHECK_FUNCS([mntctl]) AC_CHECK_DECL([mntctl], [AC_DEFINE([HAVE_DECL_MNTCTL], 1, [define when mntctl() is declared properly])], ,[ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_MNTCTL_H # include #endif #ifdef HAVE_SYS_VMOUNT_H #include #endif ]) AC_CHECK_DECL([getprocs64], [AC_DEFINE([HAVE_DECL_GETPROCS64], 1, [define when getprocs64() is declared properly])], ,[ AC_INCLUDES_DEFAULT #ifdef HAVE_PROCINFO_H # include #endif ]) AC_CHECK_DECL([getargs], [AC_DEFINE([HAVE_DECL_GETARGS], 1, [define when getargs() is declared properly])], ,[ AC_INCLUDES_DEFAULT #ifdef HAVE_PROCINFO_H # include #endif ]) ], [freebsd4.*], [ AC_DEFINE(FREEBSD, , [Building on FreeBSD]) ], [freebsd[[5-9]].*|freebsd10.*], [ AC_DEFINE(FREEBSD, , [Building on FreeBSD]) AC_DEFINE(FREEBSD5, , [Building on FreeBSD 5.x - 10.x]) ], [dragonfly*], [ AC_DEFINE(DFBSD, , [Building on DragonFlyBSD]) ENABLE_THREADS_DEFAULT="no" ], [kfreebsd*-gnu*], [ AC_DEFINE(FREEBSD, , [Building on FreeBSD]) AC_DEFINE(FREEBSD5, , [Building on FreeBSD 5.x - 10.x]) ], [darwin*], [ AC_DEFINE(DARWIN, , [Building on Darwin]) dnl following 2 are assumed because Darwin was derived from FreeBSD5 - prove it AC_DEFINE(FREEBSD, , [Building on FreeBSD]) AC_DEFINE(FREEBSD5, , [Building on FreeBSD 5.x - 10.x]) AX_APPEND_TO_VAR([LINKFLAGS], ["-framework IOKit" "-framework CoreFoundation"]) #LINKFLAGS="${LINKFLAGS} -framework IOKit" ], [netbsd*], [ AC_DEFINE(NETBSD, , [Building on NetBSD]) ], [openbsd*], [ AC_DEFINE(OPENBSD, , [Building on OpenBSD]) ], [linux-gnu*], [ AC_DEFINE(LINUX, , [Building on GNU/Linux]) AM_CONDITIONAL(SETUIDBINS, true) BIN_OWNER="root" BIN_PERM="4755" AC_DEFINE(HAVE_PROCFS, 1, [Define to signal that procfs is available]) AC_CHECK_HEADERS([linux/ethtool.h linux/sockios.h]) AS_IF([test "x$ac_cv_header_linux_ethtool_h" != "xyes"], [ unset ac_cv_header_linux_ethtool_h ac_safe_cppflags="$CPPFLAGS" CPPFLAGS="-D__u8=uint8_t -D__u16=uint16_t -D__u32=uint32_t -D__u64=uint64_t $CPPFLAGS" AC_CHECK_HEADER([linux/ethtool.h]) CPPFLAGS="$ac_safe_cppflags" AS_IF([test "x$ac_cv_header_linux_ethtool_h" = "xyes"], [AC_DEFINE(LINUX_BROKEN_ETHTOOL_TYPES, 1, [define when linux/ethtool.h has broken types])]) ]) AS_IF([test "x$ac_cv_header_linux_ethtool_h" = "xyes"], [ AC_CHECK_MEMBER(struct ethtool_cmd.speed_hi, [AC_DEFINE(HAVE_ETHTOOL_CMD_SPEED_HI, 1, [struct ethtool_cmd.speed_hi available])], [], [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef LINUX_BROKEN_ETHTOOL_TYPES # define __u8 uint8_t # define __u16 uint16_t # define __u32 uint32_t # define __u64 uint64_t # include # undef __u8 # undef __u16 # undef __u32 # undef __u64 #endif #ifdef HAVE_LINUX_ETHTOOL_H # include #endif ] )]) ]) ], [cygwin], [ AC_DEFINE(CYGWIN, , [Building on Cygwin]) ], [mingw32], [ AC_DEFINE(MINGW, , [Building on MinGW]) AC_DEFINE(WINVER, 0x0500, [Building for Windows 2000]) AM_CONDITIONAL(MINGW, true) LINKFLAGS="-lpdh -lIphlpapi -lpsapi -lnetapi32" ], [ AC_MSG_WARN([Build on unknown OS: $host_os - many functions might be not functional]) ] ) dnl check Mach OS's AS_CASE([$host_os], dnl Darwin, probably OSF/1, Plan9?, ... [darwin*], [ AC_CHECK_HEADERS([mach/mach.h]) AS_IF([test "x$ac_cv_header_mach_mach_h" != "xyes"], [AC_CHECK_HEADERS([mach/mach_host.h mach/vm_statistics.h mach/kern_return.h mach/host_info.h])]) dnl Part of Mach Kernel Interface AC_CHECK_FUNCS([host_statistics host_statistics64]) ] ) dnl check BSD* OS's AS_CASE([$host_os], [*bsd*|darwin*|dragonfly*], [ AC_DEFINE(ALLBSD, , [Building on some kind of BSD]) AC_MSG_CHECKING([for BSD specific features]) AC_MSG_RESULT([]) AC_CHECK_HEADERS([ifaddrs.h kinfo.h net/if_media.h sys/dkstat.h sys/disk.h sys/iostat.h sys/resource.h sys/sched.h sys/ucred.h sys/user.h uvm/uvm.h sys/vmmeter.h vm/vm_param.h], , , [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H #include #endif ])]) dnl FBSD 5+ AC_CHECK_LIB(devstat, devstat_getnumdevs, [LINKFLAGS="$LINKFLAGS -ldevstat"]) dnl FBSD < 5, DragonFlyBSD?, ...? AC_CHECK_LIB(devstat, getnumdevs, [LINKFLAGS="$LINKFLAGS -ldevstat"]) AC_CHECK_HEADERS([devstat.h], , , [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #if HAVE_SYS_RESOURCE_H # include #endif ])]) AC_CHECK_LIB(kinfo, kinfo_get_sched_cputime, [LINKFLAGS="$LINKFLAGS -lkinfo"]) ax_save_libs="$LIBS" LIBS="$LIBS $LINKFLAGS" AC_CHECK_FUNCS([getfsstat devstat_getdevs devstat_selectdevs getdevs kinfo_get_sched_cputime selectdevs sysctlbyname]) LIBS="$ax_save_libs" AC_CACHE_CHECK([for properly declared and callable getvfsstat], [ac_cv_func_getvfsstat], ac_cv_func_getvfsstat=no AC_LINK_IFELSE([AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_SYS_DISK_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_STATVFS_H # include #endif int main() { struct statvfs buf; getvfsstat(&buf, sizeof(buf), 0); } ])], [ AC_DEFINE([HAVE_GETVFSSTAT], 1, [define when getvfsstat() is declared properly]) ac_cv_func_getvfsstat=yes ] ) ) AC_CHECK_TYPES([struct kinfo_proc, struct kinfo_proc2, struct io_sysctl, struct diskstats, struct disk_sysctl, struct devstat, struct statinfo], , , [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_SYS_DISK_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_DKSTAT_H # include #endif #if HAVE_SYS_RESOURCE_H # include #endif #ifdef HAVE_DEVSTAT_H # include #endif #ifdef HAVE_KINFO_H # include #endif ])]) AC_CHECK_TYPES([struct kinfo_cputime], , , [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_KINFO_H # include #endif ])]) AS_IF( [test "x$ac_cv_type_struct_io_sysctl" = "xyes"], [ AC_CHECK_MEMBER(struct io_sysctl.name, [AC_DEFINE(HAVE_IO_SYSCTL_NAME, 1, [struct io_sysctl.name available])], [AC_MSG_WARN([Probably better stop building libstatgrab when playing with statistic API])], [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #include ] )]) ]) AS_IF( [test "x$ac_cv_type_struct_disk_sysctl" = "xyes"], [ # Disk IO read and write statistics are only present on recent NetBSD # read: everyting beyond NetBSD 1.6 AC_CHECK_MEMBER(struct disk_sysctl.dk_rbytes, [AC_DEFINE(HAVE_DISK_SYSCTL_DK_RBYTES, , [New-style NetBSD disk stats])], [], [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #include ] )]) AC_CHECK_MEMBER(struct disk_sysctl.dk_name, [AC_DEFINE(HAVE_DISK_SYSCTL_DK_RBYTES, , [New-style NetBSD disk stats])], [], [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #include ] )]) ]) AS_IF( [test "x$ac_cv_type_struct_devstat" = "xyes"], [ AC_CHECK_MEMBER(struct devstat.bytes, [AC_DEFINE(HAVE_DEVSTAT_BYTES, 1, [struct devstat.bytes array available])], [], [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #if HAVE_SYS_RESOURCE_H # include #endif #ifdef HAVE_DEVSTAT_H # include #endif ] )]) AC_CHECK_MEMBER(struct devstat.bytes_read, [AC_DEFINE(HAVE_DEVSTAT_BYTES_READ, 1, [struct devstat.bytes_read available])], [], [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #if HAVE_SYS_RESOURCE_H # include #endif #ifdef HAVE_DEVSTAT_H # include #endif ] )]) ]) AS_IF( [test "x$ac_cv_type_struct_diskstats" = "xyes"], [ # Disk IO read and write statistics are only present on recent OpenBSD. AC_CHECK_MEMBER(struct diskstats.ds_rbytes, [AC_DEFINE(HAVE_DISKSTAT_DS_RBYTES, , [New-style OpenBSD disk stats])], [], [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #include ] )]) # Disk IO statistics have disknames only on recent OpenBSD. AC_CHECK_MEMBER(struct diskstats.ds_name, [AC_DEFINE(HAVE_DISKSTAT_DS_NAME, , [OpenBSD disk stats disk names])], [], [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #include ] )]) ]) AS_IF( [test "x$ac_cv_type_struct_kinfo_proc" = "xyes" -a "x$ac_cv_type_struct_kinfo_proc2" != "xyes"], [ AC_CHECK_MEMBER(struct kinfo_proc.kp_proc, [AC_DEFINE(HAVE_KINFO_PROC_KP_PROC, 1, [kp_proc member of struct kinfo_proc available])], , [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_KINFO_H # include #endif ] )]) AC_CHECK_MEMBER(struct kinfo_proc.kp_thread, [AC_DEFINE(HAVE_KINFO_PROC_KP_THREAD, 1, [kp_thread member of struct kinfo_proc available])], , [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_KINFO_H # include #endif ] )]) AC_CHECK_MEMBER(struct kinfo_proc.kp_eproc, [AC_DEFINE(HAVE_KINFO_PROC_KP_EPROC, 1, [kp_eproc member of struct kinfo_proc available])], , [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_KINFO_H # include #endif ] )]) AC_CHECK_MEMBER(struct kinfo_proc.kp_eproc.e_ucred.cr_ruid, [AC_DEFINE(HAVE_KINFO_PROC_KP_EPROC_E_UCRED_CR_RUID, 1, [kp_eproc.e_ucred.cr_ruid member of struct kinfo_proc available])], , [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_KINFO_H # include #endif ] )]) AC_CHECK_MEMBER(struct kinfo_proc.ki_stat, [AC_DEFINE(HAVE_KINFO_PROC_KI_STAT, 1, [ki_stat member of struct kinfo_proc available])], , [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_KINFO_H # include #endif ] )]) AC_CHECK_MEMBER(struct kinfo_proc.p_stat, [AC_DEFINE(HAVE_KINFO_PROC_P_STAT, 1, [p_stat member of struct kinfo_proc available])], , [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_KINFO_H # include #endif ] )]) AC_CHECK_MEMBER(struct kinfo_proc.p_vm_map_size, [AC_DEFINE(HAVE_KINFO_PROC_P_VM_MAP_SIZE, 1, [p_vm_map_size member of struct kinfo_proc available])], , [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_KINFO_H # include #endif ] )]) AC_CHECK_MEMBER(struct kinfo_proc.ki_structsize, [AC_DEFINE(HAVE_KINFO_PROC_KP_THREAD, 1, [ki_structsize member of struct kinfo_proc available])], , [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_KINFO_H # include #endif ] )]) ]) AC_CHECK_MEMBER(struct kinfo_proc.kp_pid, [AC_DEFINE(HAVE_KINFO_PROC_KP_PID, 1, [kp_pid member of struct kinfo_proc available])], , [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_KINFO_H # include #endif ] )]) AC_CHECK_MEMBER(struct kinfo_proc.p_pid, [AC_DEFINE(HAVE_KINFO_PROC_P_PID, 1, [p_pid member of struct kinfo_proc available])], , [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_KINFO_H # include #endif ] )]) AC_CHECK_TYPES([struct uvmexp_sysctl], , , [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_SYSCTL_H #include #endif #ifdef HAVE_UVM_UVM_H #include #endif ])]) AS_IF( [test "x$ac_cv_type_struct_uvmexp_sysctl" != "xyes"], [ AC_CHECK_TYPES([struct uvmexp], , , [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_SYSCTL_H #include #endif #ifdef HAVE_UVM_UVM_H #include #endif ])]) AS_IF( [test "x$ac_cv_type_struct_uvmexp" = "xyes"], [ AC_CHECK_MEMBER(struct uvmexp.swtch, [AC_DEFINE(HAVE_STRUCT_UVMEXP_SWTCH, , [struct uvmexp.swtch])], [], [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_SYSCTL_H #include #endif #ifdef HAVE_UVM_UVM_H #include #endif ] )]) AC_CHECK_MEMBER(struct uvmexp.filepages, [AC_DEFINE(HAVE_STRUCT_UVMEXP_FILEPAGES, , [struct uvmexp.filepages])], [], [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_SYSCTL_H #include #endif #ifdef HAVE_UVM_UVM_H #include #endif ] )]) AC_CHECK_MEMBER(struct uvmexp.execpages, [AC_DEFINE(HAVE_STRUCT_UVMEXP_EXECPAGES, , [struct uvmexp.execpages])], [], [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_SYSCTL_H #include #endif #ifdef HAVE_UVM_UVM_H #include #endif ] )]) ]) ]) AC_CHECK_TYPES([struct vmtotal, struct vmmeter], , , [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_SYSCTL_H #include #endif #ifdef HAVE_SYS_VMMETER_H #include #endif ])]) AC_CHECK_TYPES([struct xswdev, struct xsw_usage], , , [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_SYSCTL_H #include #endif #ifdef HAVE_VM_VM_PARAM_H #include #endif ])]) AS_IF( [test "x$ac_cv_type_struct_xswdev" = "xyes"], [ AC_CHECK_MEMBER([struct xswdev.xsw_size], [AC_DEFINE(HAVE_STRUCT_XSWDEV_SIZE, , [struct xswdev.xsw_size])], , [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_SYSCTL_H #include #endif #ifdef HAVE_VM_VM_PARAM_H #include #endif ])]) ]) AC_CHECK_TYPES([struct xvfsconf, struct vfsconf], , , [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_SYSCTL_H #include #endif #ifdef HAVE_SYS_MOUNT_H #include #endif ])]) ] ) AS_IF( [test "x$ac_cv_func_getmntent" = "xyes" -o "x$ac_cv_func_getmntent_r" = "xyes"], [ AC_ARG_WITH([mnttab], [ --with-mnttab[[=/path/to/mtab]] use (specified) mtab file ], [WITH_MNTTAB="$withval"], [WITH_MNTTAB="check"]) AC_CHECK_DECL( [MNT_MNTTAB], , [ AS_IF([test "x$cross_compiling" = "xyes"], , [ AC_CHECK_FILE([/etc/mnttab], [AC_DEFINE_UNQUOTED([MNT_MNTTAB], "/etc/mnttab", [Configure determined mtab file])], [ AC_CHECK_FILE([/etc/mtab], [AC_DEFINE_UNQUOTED([MNT_MNTTAB], "/etc/mtab", [Configure determined mtab file])]) ]) ]) ], [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTTAB_H # include #endif ] )]) AC_CHECK_DECL([setmntent], [AC_DEFINE([HAVE_DECL_SETMNTENT], 1, [define when setmntent() is declared])], ,[AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTTAB_H # include #endif ] )]) AC_CHECK_DECL([endmntent], [AC_DEFINE([HAVE_DECL_ENDMNTENT], 1, [define when endmntent() is declared])], ,[AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTTAB_H # include #endif ] )]) AC_CHECK_TYPES([struct mntent, struct mnttab], , , [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTTAB_H # include #endif ] )]) AS_IF( [test "x$ac_cv_func_getmntent" = "xyes"], [ AC_CACHE_CHECK([apparent thread safety of getmntent], ac_cv_threadsafe_getmntent, [ AC_COMPILE_IFELSE([AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTTAB_H # include #endif int main(void) { FILE *f; #if defined(HAVE_STRUCT_MNTENT) struct mntent mp; #elif defined(HAVE_STRUCT_MNTTAB) struct mnttab mp; #endif int rc; rc = getmntent(f, &mp); return 0; } ])], [ ac_cv_threadsafe_getmntent="yes" ], [ ac_cv_threadsafe_getmntent="no" ] ) ]) AS_IF( [test "x$ac_cv_threadsafe_getmntent" = "xyes"], [AC_DEFINE([HAVE_THREADSAFE_GETMNTENT], 1, [define when getmntent takes pointer to storage to fill])] ) ] ) AS_IF( [test "x$ac_cv_func_getmntent_r" = "xyes"], [ AC_MSG_CHECKING([return type of getmntent_r]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTTAB_H # include #endif int main(void) { FILE *f; struct mntent mp; char buf[[1024]]; int rc; rc = getmntent_r(f, &mp, buf, sizeof(buf)) % 10; return 0; } ])], [ AC_MSG_RESULT([int]) AC_DEFINE([GETMNTENT_R_RETURN_INT], 1, [define when getmntent_r returns success code]) ], [ AC_MSG_RESULT([struct mntent *]) ] ) ] ) ] ) AC_CHECK_TYPES([struct statfs], , , [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_VFS_H # include #endif #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_MOUNT_H # include #endif #ifdef HAVE_SYS_STATFS_H # include #endif ])]) AS_IF( [test "x$ac_cv_type_struct_statfs" = "xyes"], [ # check for several uncommon fields of struct statfs AC_CHECK_MEMBER(struct statfs.f_favail, [AC_DEFINE(HAVE_STATFS_FFAVAIL, , [define when statfs has f_favail member])], [], [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_VFS_H # include #endif #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_MOUNT_H # include #endif #ifdef HAVE_SYS_STATFS_H # include #endif ])]) AC_CHECK_MEMBER(struct statfs.f_iosize, [AC_DEFINE(HAVE_STATFS_FIOSIZE, , [define when statfs has f_iosize member])], [], [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_VFS_H # include #endif #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_MOUNT_H # include #endif #ifdef HAVE_SYS_STATFS_H # include #endif ])]) AC_CHECK_MEMBER(struct statfs.f_frsize, [AC_DEFINE(HAVE_STATFS_FFRSIZE, , [define when statfs has f_frsize member])], [], [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #ifdef HAVE_SYS_VFS_H # include #endif #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_MOUNT_H # include #endif #ifdef HAVE_SYS_STATFS_H # include #endif ])]) ] ) dnl check whether procfs is really available dnl AC_DEFINE(HAVE_PROCFS, 1, [Define to signal that procfs is available]) AX_CHECK_VISIBILITY( [ dnl AC_DEFINE_UNQUOTED([__sg_export], $ax_visibility_export, [Define export declarator]) dnl AC_DEFINE_UNQUOTED([__sg_import], $ax_visibility_import, [Define import declarator]) dnl AC_DEFINE_UNQUOTED([__sg_private], $ax_visibility_private, [Define private declarator]) SG_EXPORT="$ax_visibility_export" SG_IMPORT="$ax_visibility_import" SG_PRIVATE="$ax_visibility_private" WITH_VISIBILITY_SUPPORT=1 AC_SUBST(SG_EXPORT) AC_SUBST(SG_IMPORT) AC_SUBST(SG_PRIVATE) ],[ dnl AC_DEFINE_UNQUOTED([__sg_export]) dnl AC_DEFINE_UNQUOTED([__sg_import]) dnl AC_DEFINE_UNQUOTED([__sg_private]) WITH_VISIBILITY_SUPPORT=0 ]) AC_SUBST(WITH_VISIBILITY_SUPPORT) # User specified curses/ncurses prefix AC_ARG_WITH([curses-prefix], [ --with-curses-prefix=PATH curses (or ncurses) is in PATH], [ if test -d "$withval/lib"; then SAIDARLIBS="-L${withval}/lib ${SAIDARLIBS}" fi if test -d "$withval/include"; then SAIDARCPPFLAGS="-I${withval}/include ${SAIRDARCPPFLAGS}" fi ] ) # Check if user wants to disable statgrab AM_CONDITIONAL(STATGRAB, true) AC_ARG_ENABLE(statgrab, [ --disable-statgrab disable building of statgrab], [ if test "x$enableval" = "xno" ; then AM_CONDITIONAL(STATGRAB, false) fi ] ) # Check if user wants to disable saidar AM_CONDITIONAL(SAIDAR, true) AC_ARG_ENABLE(saidar, [ --disable-saidar disable building of saidar], [ if test "x$enableval" = "xno" ; then AM_CONDITIONAL(SAIDAR, false) fi ], [ # saidar needs curses # (if we don't find curses we disable saidar) MP_WITH_CURSES AC_CHECK_HEADERS([termios.h sys/termios.h]) ] ) # Check if the user would prefer not to build examples AM_CONDITIONAL(EXAMPLES, true) AC_ARG_ENABLE(examples, [ --disable-examples disable building of examples], [ if test "x$enableval" = "xno" ; then AM_CONDITIONAL(EXAMPLES, false) fi ] ) # Check if user wants to make and install manpages # XXX split between make and install AC_ARG_ENABLE(man-build, [ --enable-man-build enable building of manpages (default in maintainer-mode) --disable-man-build disable building of manpages (default in all other cases)], [ENABLE_BUILD_MANPAGES="${enableval}"], [ AS_IF( [test "x$USE_MAINTAINER_MODE" = "xyes"], [ENABLE_BUILD_MANPAGES="yes"], [ENABLE_BUILD_MANPAGES="check"] ) ] ) AM_CONDITIONAL(BUILD_MANPAGES, false) AS_IF( [test "x${ENABLE_MANPAGES}" = "xno"], [AM_CONDITIONAL(BUILD_MANPAGES, false)], [ dnl check if whether docbook is available AC_MSG_CHECKING([for applicable docbook2man]) AC_PATH_PROGS_FEATURE_CHECK([docbook2man_prog], [docbook2x-man docbook2man], [ output=`$ac_path_docbook2man_prog --help 2>/dev/null | grep "Convert DocBook XML documents to man pages"` AS_IF([test -n "$output"], [ ac_path_docbook2man_prog_found=: ac_cv_path_docbook2man_prog="$ac_path_docbook2man_prog" ]) ], [ docbook2man_prog="none" ac_cv_path_docbook2man_prog="none" ]) AC_MSG_RESULT($ac_cv_path_docbook2man_prog) AS_IF( [test "x$enableval" = "xyes" -a "x$ac_cv_path_docbook2man_prog" = "xnone"], [ AC_MSG_ERROR([Want manpages being build but have no docbook2man]) ], [test "x$ac_cv_path_docbook2man_prog" != "xnone"], [ AM_CONDITIONAL(BUILD_MANPAGES, true) DOCBOOK2MAN="$ac_cv_path_docbook2man_prog" AC_SUBST(DOCBOOK2MAN) AC_MSG_NOTICE([enabling build of manpages using $DOCBOOK2MAN]) ] ) ] ) # Check if user wants to make tests AC_ARG_ENABLE(tests, [ --enable-tests enable test building (default in maintainer-mode) --disable-tests disable test building (default in all other cases)], [ENABLE_TESTS="${enableval}"], [ AS_IF( [test "x$USE_MAINTAINER_MODE" = "xyes"], [ENABLE_TESTS="yes"], [ENABLE_TESTS="check"] ) ] ) AM_CONDITIONAL(TESTS, false) AM_CONDITIONAL(TEST_SCRIPTS, false) AS_IF( [test "x$ENABLE_TESTS" != "xno"], [ AM_CONDITIONAL(TESTS, true) AX_PROG_PERL5( , , [5.006], [Getopt::Long, Test::More 0.90, Data::Dumper, IPC::Cmd], [ AC_MSG_NOTICE([enabling build of test automation using $PERL5]) AM_CONDITIONAL(TEST_SCRIPTS, true) ], [ AS_IF( [test "x$ENABLE_TESTS" = "xyes"], [ AC_MSG_FAILURE([Tests are required but no suitable Perl5 environment found]) ]) ] ) ] ) # Check if the user wants to turn on setgid binaries # If they specify nothing disable them AC_ARG_ENABLE(setgid-binaries, [ --enable-setgid-binaries enable binaries being setgid when needed], [ if test "x$enableval" = "xno" ; then AM_CONDITIONAL(SETGIDBINS, false) fi ], [ AM_CONDITIONAL(SETGIDBINS, false) ] ) # Check if the user wants to turn on setuid binaries # If they specify nothing disable them AC_ARG_ENABLE(setuid-binaries, [ --enable-setuid-binaries enable binaries being setuid when needed], [ if test "x$enableval" = "xno" ; then AM_CONDITIONAL(SETUIDBINS, false) fi ], [ AM_CONDITIONAL(SETUIDBINS, false) ] ) # Check if the user wants to support access from multiple threads AC_ARG_ENABLE(thread-support, [ --disable-thread-support disable support for multi-threaded environments], [ENABLE_THREADS="$enableval"], [ENABLE_THREADS="$ENABLE_THREADS_DEFAULT"] ) AS_IF([test "x$ac_cv_func_strerror_r" = "xyes"], [ AC_MSG_CHECKING([return type of strerror_r]) AC_COMPILE_IFELSE([AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT int main(void) { char buf[[1024]]; int rc; rc = strerror_r(1, buf, sizeof(buf)) % 10; return 0; } ])], [ AC_MSG_RESULT([int]) AC_DEFINE([STRERROR_R_RETURN_INT], 1, [define when strerror_r returns success code]) ], [ AC_MSG_RESULT([char *]) ] ) ]) AM_CONDITIONAL(ENABLE_THREADS, false) WITH_THREADS_CONFIGURED=0 AS_IF( [test "x${ENABLE_THREADS}" != "xno"], [ AX_WIN32( [ AC_DEFINE([ENABLE_THREADS], 1, [Define if you want the thread support compiled in.]) WITH_THREADS_CONFIGURED=1 AM_CONDITIONAL(ENABLE_THREADS, true) ], [ AX_PTHREAD( [ AC_DEFINE([ENABLE_THREADS], 1, [Define if you want the thread support compiled in.]) AC_DEFINE(HAVE_PTHREAD, 1, [Define if you have POSIX threads libraries and header files.]) CC="$PTHREAD_CC" CXX="$PTHREAD_CXX" AS_IF([test -n "$PTHREAD_LIBS"], [LINKFLAGS="$LINKFLAGS $PTHREAD_LIBS"]) AS_IF([test -n "$PTHREAD_CFLAGS"], [CFLAGS="$CFLAGS $PTHREAD_CFLAGS"]) AC_CHECK_HEADERS([pthread.h]) AS_IF( [test "x$ac_cv_func_strerror_r" != "xyes" -a "x$ac_cv_threadsafe_strerror" != "xyes"], [AC_MSG_ERROR([strerror_r or thread safe strerror required])]) AM_CONDITIONAL(ENABLE_THREADS, true) WITH_THREADS_CONFIGURED=1 # Braces checks derived from here: # http://git.savannah.gnu.org/gitweb/?p=guile.git;a=blob_plain;f=configure.ac;hb=HEAD old_CFLAGS="$CFLAGS" if test "$GCC" = "yes"; then # Since GCC only issues a warning for missing braces, so we need # `-Werror' to catch it. CFLAGS="-Werror -Wmissing-braces $CFLAGS" fi AC_CACHE_CHECK([whether PTHREAD_ONCE_INIT needs braces], mp_cv_need_braces_on_pthread_once_init, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include pthread_once_t foo = PTHREAD_ONCE_INIT;]])], [mp_cv_need_braces_on_pthread_once_init=no], [mp_cv_need_braces_on_pthread_once_init=yes])]) if test "$mp_cv_need_braces_on_pthread_once_init" = yes; then AC_DEFINE([NEED_PTHREAD_ONCE_INIT_BRACES], 1, [Define to 1 if PTHREAD_ONCE_INIT needs braces.]) fi AC_CACHE_CHECK([whether PTHREAD_MUTEX_INITIALIZER needs braces], mp_cv_need_braces_on_pthread_mutex_initializer, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include pthread_mutex_t foo = PTHREAD_MUTEX_INITIALIZER;]])], [mp_cv_need_braces_on_pthread_mutex_initializer=no], [mp_cv_need_braces_on_pthread_mutex_initializer=yes])]) if test "$mp_cv_need_braces_on_pthread_mutex_initializer" = yes; then AC_DEFINE([NEED_PTHREAD_MUTEX_INITIALIZER_BRACES], 1, [Define to 1 if PTHREAD_ONCE_INIT needs braces.]) fi CFLAGS="$old_CFLAGS" AC_SEARCH_LIBS([sem_init], [rt]) ], [ AS_IF( [test "x${ENABLE_THREADS}" = "xyes"], [AC_MSG_ERROR([No suitable threading library found])] [AC_MSG_NOTICE(No suitable threading library found - disable TLS support)]) ] ) ]) ] ) # endif : --enable-threads AM_CONDITIONAL(WITH_LIBLOG4CPLUS, false) AM_CONDITIONAL(WITH_FULL_CONSOLE_LOGGER, false) WITH_LIBLOG4CPLUS=0 AC_ARG_ENABLE(logging, [ --enable-logging enable logging in library (force console printf, if no logging library is found) --disable-logging disable logging in library], [ENABLE_LOGGING="$enableval"], [ENABLE_LOGGING="check"]) AS_IF([test "x$ENABLE_LOGGING" != "xno"], [ AX_CHECK_WITH_LIB([log4cplus],[check]) AX_CHECK_LIB_FLAGS([log4cplus], [stdc++,stdc++ unwind], [log4cplus_basic_configure();], [ AC_INCLUDES_DEFAULT #include ], [log4cplus >= 1.0.5], [ AM_CONDITIONAL(WITH_LIBLOG4CPLUS, true) WITH_LIBLOG4CPLUS=1 AX_APPEND_TO_VAR([LINKFLAGS], ${LIBS_LOG4CPLUS}) AX_APPEND_TO_VAR([CLIBFLAGS], ${INC_LOG4CPLUS}) AC_DEFINE([WITH_LIBLOG4CPLUS], 1, [Define this when tracing shall be done using log4cplus]) AC_MSG_NOTICE([compiling in support for liblog4cplus (LIBS="$LIBS_LOG4CPLUS}")]) ] ) AS_IF([test "x$WITH_LIBLOG4CPLUS" = "x1"], [ AC_LANG_PUSH([C++]) AC_MSG_CHECKING([if liblog4cplus is built with thread support]) ax_cppflags_safe="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $CLIBFLAGS" AC_COMPILE_IFELSE([AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #include #if defined(LOG4CPLUS_SINGLE_THREADED) #error no threads #endif int main() { return 0; } ])], [ AC_MSG_RESULT([yes]) ax_liblog4cplus_threads=yes ], [ AC_MSG_RESULT([no]) ax_liblog4cplus_threads=no ] ) CPPFLAGS="$ax_cppflags_safe" AC_LANG_POP([C++]) ]) AS_IF([test "x$ENABLE_LOGGING" = "xyes" -a "x$WITH_LIBLOG4CPLUS" != "x1"], [AM_CONDITIONAL(WITH_FULL_CONSOLE_LOGGER, false) AC_DEFINE([WITH_FULL_CONSOLE_LOGGER], 1, [Define this when tracing shall be done using fprintf(stderr, ...)]) WITH_FULL_CONSOLE_LOGGER="1"]) ]) AC_SUBST([WITH_LIBLOG4CPLUS]) dnl Libtool setup. dnl must be latest to catch rpath compiled in by changes made during checks before LT_INIT AC_PROG_LIBTOOL # The LIBS and CPPFLAGS that saidar needs AC_SUBST(SAIDARLIBS) AC_SUBST(SAIDARCPPFLAGS) # The flags needed to link to libstatgrab # (ie. our dependencies) AC_SUBST(LINKFLAGS) AC_SUBST(CLIBFLAGS) # Ownership and permissions possibly needed for binaries AC_SUBST(BIN_OWNER) AC_SUBST(BIN_GROUP) AC_SUBST(BIN_PERM) dnl with or without threads - allow check in dependend libraries AC_SUBST(WITH_THREADS_CONFIGURED) # And finish by changing these files AC_CONFIG_FILES([ Makefile src/Makefile src/libstatgrab/Makefile src/statgrab/Makefile src/saidar/Makefile docs/Makefile docs/libstatgrab/Makefile docs/statgrab/Makefile docs/saidar/Makefile tests/Makefile tests/testlib/Makefile tests/single_threaded/Makefile tests/multi_threaded/Makefile examples/Makefile libstatgrab.pc src/statgrab/statgrab-make-mrtg-config src/statgrab/statgrab-make-mrtg-index]) AC_CONFIG_FILES([src/libstatgrab/statgrab.h]) AC_OUTPUT libstatgrab-0.90/configure000755 001750 001750 00003025331 12200045536 015627 0ustar00tdbusers000000 000000 #! /bin/sh # From configure.ac Revision. # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for libstatgrab 0.90. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: https://github.com/i-scream/libstatgrab/issues about $0: your system, including any error possibly output before $0: this message. Then install a modern shell, or manually $0: run the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='libstatgrab' PACKAGE_TARNAME='libstatgrab' PACKAGE_VERSION='0.90' PACKAGE_STRING='libstatgrab 0.90' PACKAGE_BUGREPORT='https://github.com/i-scream/libstatgrab/issues' PACKAGE_URL='http://www.i-scream.org/libstatgrab/' ac_unique_file="src/libstatgrab/cpu_stats.c" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_c_werror_flag= ac_c_werror_flag= ac_c_werror_flag= ac_c_werror_flag= ac_c_werror_flag= ac_c_werror_flag= ac_c_werror_flag= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS WITH_THREADS_CONFIGURED BIN_PERM BIN_GROUP BIN_OWNER CLIBFLAGS LINKFLAGS SAIDARCPPFLAGS SAIDARLIBS CXXCPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB DLLTOOL OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LIBTOOL WITH_LIBLOG4CPLUS HAVE_LIBLOG4CPLUS LIBS_LOG4CPLUS INC_LOG4CPLUS log4cplus_LIBS log4cplus_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG WITH_FULL_CONSOLE_LOGGER_FALSE WITH_FULL_CONSOLE_LOGGER_TRUE WITH_LIBLOG4CPLUS_FALSE WITH_LIBLOG4CPLUS_TRUE PTHREAD_CFLAGS PTHREAD_LIBS PTHREAD_CXX PTHREAD_CC ax_pthread_config ENABLE_THREADS_FALSE ENABLE_THREADS_TRUE PERL5 TEST_SCRIPTS_FALSE TEST_SCRIPTS_TRUE TESTS_FALSE TESTS_TRUE DOCBOOK2MAN BUILD_MANPAGES_FALSE BUILD_MANPAGES_TRUE EXAMPLES_FALSE EXAMPLES_TRUE SAIDAR_FALSE SAIDAR_TRUE STATGRAB_FALSE STATGRAB_TRUE WITH_VISIBILITY_SUPPORT SG_PRIVATE SG_IMPORT SG_EXPORT LD FGREP MINGW_FALSE MINGW_TRUE SETUIDBINS_FALSE SETUIDBINS_TRUE SETGIDBINS_FALSE SETGIDBINS_TRUE EGREP CPP ac_ct_AR AR GREP SED am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC host_os host_vendor host_cpu host build_os build_vendor build_cpu build MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_maintainer_mode enable_dependency_tracking enable_direct_format_search with_mnttab with_gnu_ld with_curses_prefix enable_statgrab enable_saidar with_ncurses enable_examples enable_man_build enable_tests with_perl5 enable_setgid_binaries enable_setuid_binaries enable_thread_support enable_logging with_log4cplus with_liblog4cplus_prefix enable_shared enable_static with_pic enable_fast_install with_sysroot enable_libtool_lock ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR log4cplus_CFLAGS log4cplus_LIBS CXXCPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures libstatgrab 0.90 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/libstatgrab] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of libstatgrab 0.90:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-direct-format-search[=list] enables direct searching for printf/scantf format search, skipping default checking --disable-direct-format-search disables direct format string searching --disable-statgrab disable building of statgrab --disable-saidar disable building of saidar --disable-examples disable building of examples --enable-man-build enable building of manpages (default in maintainer-mode) --disable-man-build disable building of manpages (default in all other cases) --enable-tests enable test building (default in maintainer-mode) --disable-tests disable test building (default in all other cases) --enable-setgid-binaries enable binaries being setgid when needed --enable-setuid-binaries enable binaries being setuid when needed --disable-thread-support disable support for multi-threaded environments --enable-logging enable logging in library (force console printf, if no logging library is found) --disable-logging disable logging in library --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-mnttab[=/path/to/mtab] use (specified) mtab file --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-curses-prefix=PATH curses (or ncurses) is in PATH --without-ncurses Do not use ncurses --with-perl5[=/path/to/perl5] --without-perl5 --with-log4cplus will check for log4cplus --without-log4cplus will not check for log4cplus --with-liblog4cplus-prefix[=DIR] search for log4cplus in DIR/include and DIR/lib --without-liblog4cplus-prefix search for log4cplus in DIR/include and DIR/lib --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path log4cplus_CFLAGS C compiler flags for log4cplus, overriding pkg-config log4cplus_LIBS linker flags for log4cplus, overriding pkg-config CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . libstatgrab home page: . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF libstatgrab configure 0.90 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------------------------------------- ## ## Report this to https://github.com/i-scream/libstatgrab/issues ## ## ------------------------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_find_intX_t LINENO BITS VAR # ----------------------------------- # Finds a signed integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_intX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5 $as_echo_n "checking for int$2_t... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in int$2_t 'int' 'long int' \ 'long long int' 'short int' 'signed char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default enum { N = $2 / 2 - 1 }; int main () { static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default enum { N = $2 / 2 - 1 }; int main () { static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1) < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else case $ac_type in #( int$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if eval test \"x\$"$3"\" = x"no"; then : else break fi done fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_intX_t # ac_fn_c_find_uintX_t LINENO BITS VAR # ------------------------------------ # Finds an unsigned integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_uintX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 $as_echo_n "checking for uint$2_t... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : case $ac_type in #( uint$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if eval test \"x\$"$3"\" = x"no"; then : else break fi done fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_uintX_t # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES # --------------------------------------------- # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. ac_fn_c_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_decl # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- # Tries to find if the field MEMBER exists in type AGGR, after including # INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_member # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 &5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by libstatgrab $as_me 0.90, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.12' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='libstatgrab' VERSION='0.90' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='libstatgrab' VERSION='0.90' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # The file we use to pass #define's to the source ac_config_headers="$ac_config_headers config.h" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE # Revision number (automatically updated) # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac cat >>confdefs.h <<_ACEOF #define OS_TYPE "$host_os" _ACEOF # Checks for programs ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 $as_echo_n "checking for $CC option to accept ISO C99... " >&6; } if ${ac_cv_prog_cc_c99+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #include // Check varargs macros. These examples are taken from C99 6.10.3.5. #define debug(...) fprintf (stderr, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK your preprocessor is broken; #endif #if BIG_OK #else your preprocessor is broken; #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\0'; ++i) continue; return 0; } // Check varargs and va_copy. static void test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str; int number; float fnumber; while (*format) { switch (*format++) { case 's': // string str = va_arg (args_copy, const char *); break; case 'd': // int number = va_arg (args_copy, int); break; case 'f': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); } int main () { // Check bool. _Bool success = false; // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. test_varargs ("s, d' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' || dynamic_array[ni.number - 1] != 543); ; return 0; } _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c99" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c99" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 $as_echo "$ac_cv_prog_cc_c99" >&6; } ;; esac if test "x$ac_cv_prog_cc_c99" != xno; then : fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" if test -n "$ac_tool_prefix"; then for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} { $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 $as_echo_n "checking the archiver ($AR) interface... " >&6; } if ${am_cv_ar_interface+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_ar_interface=ar cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int some_variable = 0; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=ar else am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=lib else am_cv_ar_interface=unknown fi fi rm -f conftest.lib libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 $as_echo "$am_cv_ar_interface" >&6; } case $am_cv_ar_interface in ar) ;; lib) # Microsoft lib, so override with the ar-lib wrapper script. # FIXME: It is wrong to rewrite AR. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__AR in this case, # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something # similar. AR="$am_aux_dir/ar-lib $AR" ;; unknown) as_fn_error $? "could not determine $AR interface" "$LINENO" 5 ;; esac # define default language ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Checks for standard C header files ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if ${ac_cv_header_stdbool_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; /* See body of main program for 'e'. */ char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; int main () { bool e = &s; *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdbool_h=yes else ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi if test "x$ac_cv_header_stdc" != "xyes"; then : for ac_header in assert.h ctype.h errno.h float.h limits.h locale.h math.h setjmp.h signal.h stdarg.h stddef.h stdlib.h string.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done fi ac_includes_default="\ ${ac_includes_default} #ifndef __cplusplus # ifdef HAVE_STDBOOL_H # include # endif #endif" # Checks for typedefs, structures, and compiler characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "8" "ac_cv_c_int8_t" case $ac_cv_c_int8_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int8_t $ac_cv_c_int8_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "16" "ac_cv_c_int16_t" case $ac_cv_c_int16_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int16_t $ac_cv_c_int16_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "32" "ac_cv_c_int32_t" case $ac_cv_c_int32_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int32_t $ac_cv_c_int32_t _ACEOF ;; esac ac_fn_c_find_intX_t "$LINENO" "64" "ac_cv_c_int64_t" case $ac_cv_c_int64_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define int64_t $ac_cv_c_int64_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "8" "ac_cv_c_uint8_t" case $ac_cv_c_uint8_t in #( no|yes) ;; #( *) $as_echo "#define _UINT8_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint8_t $ac_cv_c_uint8_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "16" "ac_cv_c_uint16_t" case $ac_cv_c_uint16_t in #( no|yes) ;; #( *) cat >>confdefs.h <<_ACEOF #define uint16_t $ac_cv_c_uint16_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "32" "ac_cv_c_uint32_t" case $ac_cv_c_uint32_t in #( no|yes) ;; #( *) $as_echo "#define _UINT32_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint32_t $ac_cv_c_uint32_t _ACEOF ;; esac ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" case $ac_cv_c_uint64_t in #( no|yes) ;; #( *) $as_echo "#define _UINT64_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint64_t $ac_cv_c_uint64_t _ACEOF ;; esac ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default" if test "x$ac_cv_type_ssize_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define ssize_t int _ACEOF fi ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" if test "x$ac_cv_type_off_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define off_t long int _ACEOF fi ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default" if test "x$ac_cv_type_pid_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5 $as_echo_n "checking for uid_t in sys/types.h... " >&6; } if ${ac_cv_type_uid_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "uid_t" >/dev/null 2>&1; then : ac_cv_type_uid_t=yes else ac_cv_type_uid_t=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5 $as_echo "$ac_cv_type_uid_t" >&6; } if test $ac_cv_type_uid_t = no; then $as_echo "#define uid_t int" >>confdefs.h $as_echo "#define gid_t int" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5 $as_echo_n "checking for uid_t in sys/types.h... " >&6; } if ${ac_cv_type_uid_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "uid_t" >/dev/null 2>&1; then : ac_cv_type_uid_t=yes else ac_cv_type_uid_t=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5 $as_echo "$ac_cv_type_uid_t" >&6; } if test $ac_cv_type_uid_t = no; then $as_echo "#define uid_t int" >>confdefs.h $as_echo "#define gid_t int" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "time_t" "ac_cv_type_time_t" "$ac_includes_default" if test "x$ac_cv_type_time_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define time_t long int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long int" >&5 $as_echo_n "checking for long long int... " >&6; } if ${ac_cv_type_long_long_int+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* For now, do not test the preprocessor; as of 2007 there are too many implementations with broken preprocessors. Perhaps this can be revisited in 2012. In the meantime, code should not expect #if to work with literals wider than 32 bits. */ /* Test literals. */ long long int ll = 9223372036854775807ll; long long int nll = -9223372036854775807LL; unsigned long long int ull = 18446744073709551615ULL; /* Test constant expressions. */ typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll) ? 1 : -1)]; typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1 ? 1 : -1)]; int i = 63; int main () { /* Test availability of runtime routines for shift and division. */ long long int llmax = 9223372036854775807ll; unsigned long long int ullmax = 18446744073709551615ull; return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i) | (llmax / ll) | (llmax % ll) | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i) | (ullmax / ull) | (ullmax % ull)); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if test "$cross_compiling" = yes; then : ac_cv_type_long_long_int=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef LLONG_MAX # define HALF \ (1LL << (sizeof (long long int) * CHAR_BIT - 2)) # define LLONG_MAX (HALF - 1 + HALF) #endif int main () { long long int n = 1; int i; for (i = 0; ; i++) { long long int m = n << i; if (m >> i != n) return 1; if (LLONG_MAX / 2 < m) break; } return 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_type_long_long_int=yes else ac_cv_type_long_long_int=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi else ac_cv_type_long_long_int=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_long_int" >&5 $as_echo "$ac_cv_type_long_long_int" >&6; } if test $ac_cv_type_long_long_int = yes; then $as_echo "#define HAVE_LONG_LONG_INT 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned long long int" >&5 $as_echo_n "checking for unsigned long long int... " >&6; } if ${ac_cv_type_unsigned_long_long_int+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* For now, do not test the preprocessor; as of 2007 there are too many implementations with broken preprocessors. Perhaps this can be revisited in 2012. In the meantime, code should not expect #if to work with literals wider than 32 bits. */ /* Test literals. */ long long int ll = 9223372036854775807ll; long long int nll = -9223372036854775807LL; unsigned long long int ull = 18446744073709551615ULL; /* Test constant expressions. */ typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll) ? 1 : -1)]; typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1 ? 1 : -1)]; int i = 63; int main () { /* Test availability of runtime routines for shift and division. */ long long int llmax = 9223372036854775807ll; unsigned long long int ullmax = 18446744073709551615ull; return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i) | (llmax / ll) | (llmax % ll) | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i) | (ullmax / ull) | (ullmax % ull)); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_type_unsigned_long_long_int=yes else ac_cv_type_unsigned_long_long_int=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_unsigned_long_long_int" >&5 $as_echo "$ac_cv_type_unsigned_long_long_int" >&6; } if test $ac_cv_type_unsigned_long_long_int = yes; then $as_echo "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h fi ac_fn_c_check_decl "$LINENO" "_AIX" "ac_cv_have_decl__AIX" "$ac_includes_default" if test "x$ac_cv_have_decl__AIX" = xyes; then : ac_cv_need_minus_d_linux_source_compat="yes"; ac_cv_need_minus_d_all_source="yes" fi ac_fn_c_check_decl "$LINENO" "__linux" "ac_cv_have_decl___linux" "$ac_includes_default" if test "x$ac_cv_have_decl___linux" = xyes; then : ac_cv_need_minus_d_gnu_source="yes" fi ac_fn_c_check_decl "$LINENO" "__sun" "ac_cv_have_decl___sun" "$ac_includes_default" if test "x$ac_cv_have_decl___sun" = xyes; then : ac_cv_need_minus_d_extensions="yes"; ac_cv_need_minus_d_posix_pthread_semantics="yes" fi ac_fn_c_check_decl "$LINENO" "__hpux" "ac_cv_have_decl___hpux" "$ac_includes_default" if test "x$ac_cv_have_decl___hpux" = xyes; then : ac_cv_need_minus_d_hpux_source="yes" fi if test "x$ac_cv_need_minus_d_linux_source_compat" = "xyes"; then : CPPFLAGS="$CPPFLAGS -D_LINUX_SOURCE_COMPAT" fi if test "x$ac_cv_need_minus_d_gnu_source" = "xyes"; then : CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE" fi if test "x$ac_cv_need_minus_d_all_source" = "xyes"; then : CPPFLAGS="$CPPFLAGS -D_ALL_SOURCE" fi if test "x$ac_cv_need_minus_d_extensions" = "xyes"; then : CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__" fi if test "x$ac_cv_need_minus_d_posix_pthread_semantics" = "xyes"; then : CPPFLAGS="$CPPFLAGS -D_POSIX_PTHREAD_SEMANTICS" fi if test "x$ac_cv_need_minus_d_hpux_source" = "xyes"; then : CPPFLAGS="$CPPFLAGS -D_HPUX_SOURCE" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking which _XOPEN_SOURCE macro must be defined" >&5 $as_echo_n "checking which _XOPEN_SOURCE macro must be defined... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include int main () { int rc; rc = nice( 5 ); rc = chroot( "/tmp" ); return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : HAVE_XOPEN_SOURCE_LEVEL="300" HAVE_XOPEN_SOURCE="XPG3" NEED_DEFINE_XOPEN_SOURCE=0 else ax_safe_cppflags="${CPPFLAGS}" CPPFLAGS="${CPPFLAGS} -D_XOPEN_SOURCE" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include int main () { int rc; rc = nice( 5 ); rc = chroot( "/tmp" ); return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : HAVE_XOPEN_SOURCE_LEVEL="300" HAVE_XOPEN_SOURCE="XPG3" NEED_DEFINE_XOPEN_SOURCE=1 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="${ax_safe_cppflags}" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include #include int main (int argc, char **argv) { size_t len; char buf[1024]; int ch, status = 0; pid_t child = 100; len = confstr( 1, buf, sizeof(buf ) ); ch = getopt( argc, argv, "h" ); rc = waitpid( child, &status, WNOHANG ); return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : HAVE_XOPEN_SOURCE_LEVEL="400" HAVE_XOPEN_SOURCE="XPG4" NEED_DEFINE_XOPEN_SOURCE=0 else ax_safe_cppflags="${CPPFLAGS}" CPPFLAGS="${CPPFLAGS} -D_XOPEN_SOURCE=4" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include #include int main (int argc, char **argv) { size_t len; char buf[1024]; int ch, status = 0; pid_t child = 100; len = confstr( 1, buf, sizeof(buf ) ); ch = getopt( argc, argv, "h" ); rc = waitpid( child, &status, WNOHANG ); return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : HAVE_XOPEN_SOURCE_LEVEL="400" HAVE_XOPEN_SOURCE="XPG4" NEED_DEFINE_XOPEN_SOURCE=1 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="${ax_safe_cppflags}" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include #include int main () { char buf[1024]; size_t sz = sizeof(buf); int rc; struct rlimit rl; rc = gethostname( buf, sz ); rc = getrlimit( RLIMIT_CORE, &rl ); return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : HAVE_XOPEN_SOURCE_LEVEL="420" HAVE_XOPEN_SOURCE="XPG4.2" NEED_DEFINE_XOPEN_SOURCE=0 else ax_safe_cppflags="${CPPFLAGS}" CPPFLAGS="${CPPFLAGS} -D_XOPEN_SOURE -D_XOPEN_SOURCE_EXTENDED" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include #include int main () { char buf[1024]; size_t sz = sizeof(buf); int rc; struct rlimit rl; rc = gethostname( buf, sz ); rc = getrlimit( RLIMIT_CORE, &rl ); return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : HAVE_XOPEN_SOURCE_LEVEL="420" HAVE_XOPEN_SOURCE="XPG4.2" NEED_DEFINE_XOPEN_SOURCE=1 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="${ax_safe_cppflags}" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include #include int main () { int rc; struct utmpx *utent; rc = ftruncate( 1, 1024 ); rc = fsync( 1 ); setutxent(); utent = getutxent(); endutxent(); return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : HAVE_XOPEN_SOURCE_LEVEL="500" HAVE_XOPEN_SOURCE="XPG5" NEED_DEFINE_XOPEN_SOURCE=0 else ax_safe_cppflags="${CPPFLAGS}" CPPFLAGS="${CPPFLAGS} -D_XOPEN_SOURE=500" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include #include int main () { int rc; struct utmpx *utent; rc = ftruncate( 1, 1024 ); rc = fsync( 1 ); setutxent(); utent = getutxent(); endutxent(); return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : HAVE_XOPEN_SOURCE_LEVEL="500" HAVE_XOPEN_SOURCE="XPG5" NEED_DEFINE_XOPEN_SOURCE=1 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="${ax_safe_cppflags}" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include int main () { int rc; char *s1 = NULL, *s2 = NULL; const char *addr; char addr_str[64]; struct sockaddr_in sock_buf; rc = inet_pton( AF_INET, "127.0.0.1", &sock_buf ); addr = inet_ntop( AF_INET, &sock_buf, addr_str, sizeof(addr_str) ); return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : HAVE_XOPEN_SOURCE_LEVEL="520" HAVE_XOPEN_SOURCE="XPG5.2" NEED_DEFINE_XOPEN_SOURCE=0 else ax_safe_cppflags="${CPPFLAGS}" CPPFLAGS="${CPPFLAGS} -D_XOPEN_SOURE=520" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include int main () { int rc; char *s1 = NULL, *s2 = NULL; const char *addr; char addr_str[64]; struct sockaddr_in sock_buf; rc = inet_pton( AF_INET, "127.0.0.1", &sock_buf ); addr = inet_ntop( AF_INET, &sock_buf, addr_str, sizeof(addr_str) ); return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : HAVE_XOPEN_SOURCE_LEVEL="520" HAVE_XOPEN_SOURCE="XPG5.2" NEED_DEFINE_XOPEN_SOURCE=1 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="${ax_safe_cppflags}" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include int main () { int rc; char *s1 = NULL, *s2 = NULL; rc = setenv( s1, s2, 0 ); rc = setegid( 0 ); rc = seteuid( 0 ); return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : HAVE_XOPEN_SOURCE_LEVEL="600" HAVE_XOPEN_SOURCE="XPG6" NEED_DEFINE_XOPEN_SOURCE=0 else ax_safe_cppflags="${CPPFLAGS}" CPPFLAGS="${CPPFLAGS} -D_XOPEN_SOURE=600" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include int main () { int rc; char *s1 = NULL, *s2 = NULL; rc = setenv( s1, s2, 0 ); rc = setegid( 0 ); rc = seteuid( 0 ); return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : HAVE_XOPEN_SOURCE_LEVEL="600" HAVE_XOPEN_SOURCE="XPG6" NEED_DEFINE_XOPEN_SOURCE=1 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="${ax_safe_cppflags}" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include #include #include #include #include int main () { int rc, i; struct dirent *d1 = NULL, *d2 = NULL; char *s1 = NULL, *s2 = NULL, *s3 = NULL; FILE *f = NULL; size_t len = 1024; ssize_t si; rc = alphasort( &d1, &d2 ); rc = faccessat( 1, s1, R_OK, AT_EACCESS ); rc = fexecve( 1, &s1, &s2 ); f = fmemopen( s1, 1024, s2 ); si = getdelim( &s1, &len, ' ', f ); si = getline( &s1, &len, f ); s3 = stpcpy( s1, s2 ); s3 = stpncpy( s1, s2, len ); len = strnlen( s1, 1024 ); s2 = strndup( s1, 1024 ); s1 = strsignal( SIGINT ); return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : HAVE_XOPEN_SOURCE_LEVEL="700" HAVE_XOPEN_SOURCE="XPG7" NEED_DEFINE_XOPEN_SOURCE=0 else ax_safe_cppflags="${CPPFLAGS}" CPPFLAGS="${CPPFLAGS} -D_XOPEN_SOURE=700" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include #include #include #include #include int main () { int rc, i; struct dirent *d1 = NULL, *d2 = NULL; char *s1 = NULL, *s2 = NULL, *s3 = NULL; FILE *f = NULL; size_t len = 1024; ssize_t si; rc = alphasort( &d1, &d2 ); rc = faccessat( 1, s1, R_OK, AT_EACCESS ); rc = fexecve( 1, &s1, &s2 ); f = fmemopen( s1, 1024, s2 ); si = getdelim( &s1, &len, ' ', f ); si = getline( &s1, &len, f ); s3 = stpcpy( s1, s2 ); s3 = stpncpy( s1, s2, len ); len = strnlen( s1, 1024 ); s2 = strndup( s1, 1024 ); s1 = strsignal( SIGINT ); return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : HAVE_XOPEN_SOURCE_LEVEL="700" HAVE_XOPEN_SOURCE="XPG7" NEED_DEFINE_XOPEN_SOURCE=1 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="${ax_safe_cppflags}" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "${NEED_DEFINE_XOPEN_SOURCE}" -eq "1"; then : if test "X${HAVE_XOPEN_SOURCE}" = "XEXTENDED"; then : XOPEN_SOURCE_CPPFLAGS="-D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED" else XOPEN_SOURCE_CPPFLAGS="-D_XOPEN_SOURCE=${HAVE_XOPEN_SOURCE}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XOPEN_SOURCE_CPPFLAGS" >&5 $as_echo "$XOPEN_SOURCE_CPPFLAGS" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none ($HAVE_XOPEN_SOURCE)" >&5 $as_echo "none ($HAVE_XOPEN_SOURCE)" >&6; } fi cat >>confdefs.h <<_ACEOF #define HAVE_XOPEN_SOURCE $HAVE_XOPEN_SOURCE_LEVEL _ACEOF if test -n "$XOPEN_SOURCE_CPPFLAGS"; then : CPPFLAGS="$CPPFLAGS $XOPEN_SOURCE_CPPFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostent" >&5 $as_echo_n "checking for library containing gethostent... " >&6; } if ${ac_cv_search_gethostent+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostent (); int main () { return gethostent (); ; return 0; } _ACEOF for ac_lib in '' nsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gethostent=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gethostent+:} false; then : break fi done if ${ac_cv_search_gethostent+:} false; then : else ac_cv_search_gethostent=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostent" >&5 $as_echo "$ac_cv_search_gethostent" >&6; } ac_res=$ac_cv_search_gethostent if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing setsockopt" >&5 $as_echo_n "checking for library containing setsockopt... " >&6; } if ${ac_cv_search_setsockopt+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char setsockopt (); int main () { return setsockopt (); ; return 0; } _ACEOF for ac_lib in '' socket net network; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_setsockopt=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_setsockopt+:} false; then : break fi done if ${ac_cv_search_setsockopt+:} false; then : else ac_cv_search_setsockopt=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_setsockopt" >&5 $as_echo "$ac_cv_search_setsockopt" >&6; } ac_res=$ac_cv_search_setsockopt if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi # Checks for library functions for ac_func in malloc realloc do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # getmntent is in the standard C library on UNICOS, in -lsun on Irix 4, # -lseq on Dynix/PTX, -lgen on Unixware. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing getmntent" >&5 $as_echo_n "checking for library containing getmntent... " >&6; } if ${ac_cv_search_getmntent+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char getmntent (); int main () { return getmntent (); ; return 0; } _ACEOF for ac_lib in '' sun seq gen; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_getmntent=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_getmntent+:} false; then : break fi done if ${ac_cv_search_getmntent+:} false; then : else ac_cv_search_getmntent=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getmntent" >&5 $as_echo "$ac_cv_search_getmntent" >&6; } ac_res=$ac_cv_search_getmntent if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" ac_cv_func_getmntent=yes $as_echo "#define HAVE_GETMNTENT 1" >>confdefs.h else ac_cv_func_getmntent=no fi for ac_func in atoll bzero fcntl flock getloadavg getmntent getmntent_r seteuid setegid setresuid setresgid statfs statvfs statvfs64 strerror_r strndup strnlen vsprintf vsnprintf do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # Check for some additional headers for ac_header in fcntl.h inttypes.h libgen.h limits.h netdb.h regex.h sched.h signal.h stdint.h sys/ioctl.h sys/socket.h sys/statvfs.h sys/unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_decl "$LINENO" "F_SETLK" "ac_cv_have_decl_F_SETLK" " $ac_includes_default #ifdef HAVE_FCNTL_H # include #endif #ifdef HAVE_SYS_FCNTL_H # include #endif #ifdef HAVE_SYS_FILE_H # include #endif " if test "x$ac_cv_have_decl_F_SETLK" = xyes; then : $as_echo "#define HAVE_DECL_F_SETLK 1" >>confdefs.h fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiling for native Win32" >&5 $as_echo_n "checking whether compiling for native Win32... " >&6; } if ${ax_cv_native_win32+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef _WIN32 #error "Not Win32" #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_native_win32=yes else ax_cv_native_win32=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_native_win32" >&5 $as_echo "$ax_cv_native_win32" >&6; } # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$ax_cv_native_win32" = xyes; then : for ac_header in io.h Iphlpapi.h lm.h pdh.h process.h psapi.h winsock2.h ws2tcpip.h wspiapi.h winsock.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in strerror_s do : ac_fn_c_check_func "$LINENO" "strerror_s" "ac_cv_func_strerror_s" if test "x$ac_cv_func_strerror_s" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRERROR_S 1 _ACEOF fi done else ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi for ac_header in libdevinfo.h mach/machine.h mntent.h paths.h sys/fstyp.h sys/loadavg.h sys/mnttent.h sys/mnttab.h sys/un.h sys/utsname.h sys/vfs.h utmp.h utmpx.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/param.h sys/mount.h sys/proc.h sys/swap.h sys/sysctl.h sys/systeminfo.h sys/user.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H #include #endif " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in arpa/inet.h netinet/in.h net/if.h netinet/if_ether.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" " $ac_includes_default #ifdef HAVE_SYS_SOCKET_H # include #endif #if HAVE_NETINET_IN_H # include #endif #ifdef HAVE_NETDB_H # include #endif #ifdef HAVE_ARPA_INET_H # include #endif " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/sar.h sys/sysinfo.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" " $ac_includes_default #if HAVE_SYS_SAR_H # include #endif " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in strncpy do : ac_fn_c_check_func "$LINENO" "strncpy" "ac_cv_func_strncpy" if test "x$ac_cv_func_strncpy" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRNCPY 1 _ACEOF fi done fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu case $host_os in #( solaris2.[7-9]*) : ENABLE_DIRECT_TYPE_FMT_SEARCH_DEFAULT="size_t ssize_t" hpux11.11 ;; #( *) : ENABLE_DIRECT_TYPE_FMT_SEARCH_DEFAULT="size_t ssize_t" ENABLE_DIRECT_TYPE_FMT_SEARCH_DEFAULT= ;; esac # Check whether --enable-direct-format-search was given. if test "${enable_direct_format_search+set}" = set; then : enableval=$enable_direct_format_search; ENABLE_DIRECT_TYPE_FMT_SEARCH="$enableval" else ENABLE_DIRECT_TYPE_FMT_SEARCH="$ENABLE_DIRECT_TYPE_FMT_SEARCH_DEFAULT" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for format string for pid_t" >&5 $as_echo_n "checking for format string for pid_t... " >&6; } if ${ax_cv_type_fmt_pid_t+:} false; then : $as_echo_n "(cached) " >&6 else ax_save_c_werror_flag="$ac_c_werror_flag" ac_c_werror_flag=yes if test ! "$ax_cv_type_fmt_pid_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* signed: -1 / 2 -> 0 * 0 % 4 -> 0 * 0 - 1 -> -1 * unsigned: 0xff / 2 -> 0x7f * 0x7f % 4 -> 3 * 3 - 1 -> 2 */ int fmtchk[(((pid_t)-1)/2)%4-1]; unsigned fcs = sizeof(fmtchk); printf("%u\n", fcs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(pid_t) == sizeof(unsigned int)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { pid_t testpid_t; sscanf("1234567890", "%u", &testpid_t); printf("%u\n", testpid_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_pid_t="%u" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test ! "$ax_cv_type_fmt_pid_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(pid_t) == sizeof(unsigned long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { pid_t testpid_t; sscanf("1234567890", "%lu", &testpid_t); printf("%lu\n", testpid_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_pid_t="%lu" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test ! "$ax_cv_type_fmt_pid_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(pid_t) == sizeof(unsigned long long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { pid_t testpid_t; sscanf("1234567890", "%llu", &testpid_t); printf("%llu\n", testpid_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_pid_t="%llu" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(pid_t) == sizeof(int)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { pid_t testpid_t; sscanf("1234567890", "%d", &testpid_t); printf("%d\n", testpid_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_pid_t="%d" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test ! "$ax_cv_type_fmt_pid_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(pid_t) == sizeof(long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { pid_t testpid_t; sscanf("1234567890", "%ld", &testpid_t); printf("%ld\n", testpid_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_pid_t="%ld" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test ! "$ax_cv_type_fmt_pid_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(pid_t) == sizeof(long long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { pid_t testpid_t; sscanf("1234567890", "%lld", &testpid_t); printf("%lld\n", testpid_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_pid_t="%lld" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_c_werror_flag="$ax_save_c_werror_flag" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_type_fmt_pid_t" >&5 $as_echo "$ax_cv_type_fmt_pid_t" >&6; } if test ! "$ax_cv_type_fmt_pid_t"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to find format string for pid_t" >&5 $as_echo "$as_me: WARNING: Unable to find format string for pid_t" >&2;} else cat >>confdefs.h <<_ACEOF #define FMT_PID_T "$ax_cv_type_fmt_pid_t" _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for format string for uid_t" >&5 $as_echo_n "checking for format string for uid_t... " >&6; } if ${ax_cv_type_fmt_uid_t+:} false; then : $as_echo_n "(cached) " >&6 else ax_save_c_werror_flag="$ac_c_werror_flag" ac_c_werror_flag=yes if test ! "$ax_cv_type_fmt_uid_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* signed: -1 / 2 -> 0 * 0 % 4 -> 0 * 0 - 1 -> -1 * unsigned: 0xff / 2 -> 0x7f * 0x7f % 4 -> 3 * 3 - 1 -> 2 */ int fmtchk[(((uid_t)-1)/2)%4-1]; unsigned fcs = sizeof(fmtchk); printf("%u\n", fcs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(uid_t) == sizeof(unsigned int)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { uid_t testuid_t; sscanf("1234567890", "%u", &testuid_t); printf("%u\n", testuid_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_uid_t="%u" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test ! "$ax_cv_type_fmt_uid_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(uid_t) == sizeof(unsigned long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { uid_t testuid_t; sscanf("1234567890", "%lu", &testuid_t); printf("%lu\n", testuid_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_uid_t="%lu" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test ! "$ax_cv_type_fmt_uid_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(uid_t) == sizeof(unsigned long long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { uid_t testuid_t; sscanf("1234567890", "%llu", &testuid_t); printf("%llu\n", testuid_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_uid_t="%llu" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(uid_t) == sizeof(int)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { uid_t testuid_t; sscanf("1234567890", "%d", &testuid_t); printf("%d\n", testuid_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_uid_t="%d" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test ! "$ax_cv_type_fmt_uid_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(uid_t) == sizeof(long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { uid_t testuid_t; sscanf("1234567890", "%ld", &testuid_t); printf("%ld\n", testuid_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_uid_t="%ld" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test ! "$ax_cv_type_fmt_uid_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(uid_t) == sizeof(long long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { uid_t testuid_t; sscanf("1234567890", "%lld", &testuid_t); printf("%lld\n", testuid_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_uid_t="%lld" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_c_werror_flag="$ax_save_c_werror_flag" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_type_fmt_uid_t" >&5 $as_echo "$ax_cv_type_fmt_uid_t" >&6; } if test ! "$ax_cv_type_fmt_uid_t"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to find format string for uid_t" >&5 $as_echo "$as_me: WARNING: Unable to find format string for uid_t" >&2;} else cat >>confdefs.h <<_ACEOF #define FMT_UID_T "$ax_cv_type_fmt_uid_t" _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for format string for gid_t" >&5 $as_echo_n "checking for format string for gid_t... " >&6; } if ${ax_cv_type_fmt_gid_t+:} false; then : $as_echo_n "(cached) " >&6 else ax_save_c_werror_flag="$ac_c_werror_flag" ac_c_werror_flag=yes if test ! "$ax_cv_type_fmt_gid_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* signed: -1 / 2 -> 0 * 0 % 4 -> 0 * 0 - 1 -> -1 * unsigned: 0xff / 2 -> 0x7f * 0x7f % 4 -> 3 * 3 - 1 -> 2 */ int fmtchk[(((gid_t)-1)/2)%4-1]; unsigned fcs = sizeof(fmtchk); printf("%u\n", fcs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(gid_t) == sizeof(unsigned int)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { gid_t testgid_t; sscanf("1234567890", "%u", &testgid_t); printf("%u\n", testgid_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_gid_t="%u" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test ! "$ax_cv_type_fmt_gid_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(gid_t) == sizeof(unsigned long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { gid_t testgid_t; sscanf("1234567890", "%lu", &testgid_t); printf("%lu\n", testgid_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_gid_t="%lu" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test ! "$ax_cv_type_fmt_gid_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(gid_t) == sizeof(unsigned long long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { gid_t testgid_t; sscanf("1234567890", "%llu", &testgid_t); printf("%llu\n", testgid_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_gid_t="%llu" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(gid_t) == sizeof(int)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { gid_t testgid_t; sscanf("1234567890", "%d", &testgid_t); printf("%d\n", testgid_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_gid_t="%d" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test ! "$ax_cv_type_fmt_gid_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(gid_t) == sizeof(long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { gid_t testgid_t; sscanf("1234567890", "%ld", &testgid_t); printf("%ld\n", testgid_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_gid_t="%ld" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test ! "$ax_cv_type_fmt_gid_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(gid_t) == sizeof(long long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { gid_t testgid_t; sscanf("1234567890", "%lld", &testgid_t); printf("%lld\n", testgid_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_gid_t="%lld" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_c_werror_flag="$ax_save_c_werror_flag" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_type_fmt_gid_t" >&5 $as_echo "$ax_cv_type_fmt_gid_t" >&6; } if test ! "$ax_cv_type_fmt_gid_t"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to find format string for gid_t" >&5 $as_echo "$as_me: WARNING: Unable to find format string for gid_t" >&2;} else cat >>confdefs.h <<_ACEOF #define FMT_GID_T "$ax_cv_type_fmt_gid_t" _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for format string for time_t" >&5 $as_echo_n "checking for format string for time_t... " >&6; } if ${ax_cv_type_fmt_time_t+:} false; then : $as_echo_n "(cached) " >&6 else ax_save_c_werror_flag="$ac_c_werror_flag" ac_c_werror_flag=yes if test ! "$ax_cv_type_fmt_time_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* signed: -1 / 2 -> 0 * 0 % 4 -> 0 * 0 - 1 -> -1 * unsigned: 0xff / 2 -> 0x7f * 0x7f % 4 -> 3 * 3 - 1 -> 2 */ int fmtchk[(((time_t)-1)/2)%4-1]; unsigned fcs = sizeof(fmtchk); printf("%u\n", fcs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(time_t) == sizeof(unsigned int)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { time_t testtime_t; sscanf("1234567890", "%u", &testtime_t); printf("%u\n", testtime_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_time_t="%u" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test ! "$ax_cv_type_fmt_time_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(time_t) == sizeof(unsigned long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { time_t testtime_t; sscanf("1234567890", "%lu", &testtime_t); printf("%lu\n", testtime_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_time_t="%lu" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test ! "$ax_cv_type_fmt_time_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(time_t) == sizeof(unsigned long long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { time_t testtime_t; sscanf("1234567890", "%llu", &testtime_t); printf("%llu\n", testtime_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_time_t="%llu" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(time_t) == sizeof(int)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { time_t testtime_t; sscanf("1234567890", "%d", &testtime_t); printf("%d\n", testtime_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_time_t="%d" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test ! "$ax_cv_type_fmt_time_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(time_t) == sizeof(long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { time_t testtime_t; sscanf("1234567890", "%ld", &testtime_t); printf("%ld\n", testtime_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_time_t="%ld" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test ! "$ax_cv_type_fmt_time_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(time_t) == sizeof(long long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { time_t testtime_t; sscanf("1234567890", "%lld", &testtime_t); printf("%lld\n", testtime_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_time_t="%lld" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_c_werror_flag="$ax_save_c_werror_flag" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_type_fmt_time_t" >&5 $as_echo "$ax_cv_type_fmt_time_t" >&6; } if test ! "$ax_cv_type_fmt_time_t"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to find format string for time_t" >&5 $as_echo "$as_me: WARNING: Unable to find format string for time_t" >&2;} else cat >>confdefs.h <<_ACEOF #define FMT_TIME_T "$ax_cv_type_fmt_time_t" _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for format string for size_t" >&5 $as_echo_n "checking for format string for size_t... " >&6; } if ${ax_cv_type_fmt_size_t+:} false; then : $as_echo_n "(cached) " >&6 else ax_save_c_werror_flag="$ac_c_werror_flag" ac_c_werror_flag=yes ax_var_contains_any_found= for element in yes size_t; do ax_var_contains_found= for x in $ENABLE_DIRECT_TYPE_FMT_SEARCH; do if test "X$x" = "X$element"; then : ax_var_contains_found=yes break fi done if test -n "$ax_var_contains_found"; then : ax_var_contains_any_found=yes break fi done if test -n "$ax_var_contains_any_found"; then : else if test ! "$ax_cv_type_fmt_size_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { size_t testsize_t; sscanf("1234567890", "%zu", &testsize_t); printf("%zu\n", testsize_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_size_t="%zu" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi fi if test ! "$ax_cv_type_fmt_size_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* signed: -1 / 2 -> 0 * 0 % 4 -> 0 * 0 - 1 -> -1 * unsigned: 0xff / 2 -> 0x7f * 0x7f % 4 -> 3 * 3 - 1 -> 2 */ int fmtchk[(((size_t)-1)/2)%4-1]; unsigned fcs = sizeof(fmtchk); printf("%u\n", fcs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(size_t) == sizeof(unsigned int)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { size_t testsize_t; sscanf("1234567890", "%u", &testsize_t); printf("%u\n", testsize_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_size_t="%u" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test ! "$ax_cv_type_fmt_size_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(size_t) == sizeof(unsigned long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { size_t testsize_t; sscanf("1234567890", "%lu", &testsize_t); printf("%lu\n", testsize_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_size_t="%lu" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test ! "$ax_cv_type_fmt_size_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(size_t) == sizeof(unsigned long long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { size_t testsize_t; sscanf("1234567890", "%llu", &testsize_t); printf("%llu\n", testsize_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_size_t="%llu" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(size_t) == sizeof(int)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { size_t testsize_t; sscanf("1234567890", "%d", &testsize_t); printf("%d\n", testsize_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_size_t="%d" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test ! "$ax_cv_type_fmt_size_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(size_t) == sizeof(long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { size_t testsize_t; sscanf("1234567890", "%ld", &testsize_t); printf("%ld\n", testsize_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_size_t="%ld" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test ! "$ax_cv_type_fmt_size_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(size_t) == sizeof(long long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { size_t testsize_t; sscanf("1234567890", "%lld", &testsize_t); printf("%lld\n", testsize_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_size_t="%lld" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_c_werror_flag="$ax_save_c_werror_flag" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_type_fmt_size_t" >&5 $as_echo "$ax_cv_type_fmt_size_t" >&6; } if test ! "$ax_cv_type_fmt_size_t"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to find format string for size_t" >&5 $as_echo "$as_me: WARNING: Unable to find format string for size_t" >&2;} else cat >>confdefs.h <<_ACEOF #define FMT_SIZE_T "$ax_cv_type_fmt_size_t" _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for format string for ssize_t" >&5 $as_echo_n "checking for format string for ssize_t... " >&6; } if ${ax_cv_type_fmt_ssize_t+:} false; then : $as_echo_n "(cached) " >&6 else ax_save_c_werror_flag="$ac_c_werror_flag" ac_c_werror_flag=yes ax_var_contains_any_found= for element in yes ssize_t; do ax_var_contains_found= for x in $ENABLE_DIRECT_TYPE_FMT_SEARCH; do if test "X$x" = "X$element"; then : ax_var_contains_found=yes break fi done if test -n "$ax_var_contains_found"; then : ax_var_contains_any_found=yes break fi done if test -n "$ax_var_contains_any_found"; then : else if test ! "$ax_cv_type_fmt_ssize_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { ssize_t testssize_t; sscanf("1234567890", "%zd", &testssize_t); printf("%zd\n", testssize_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_ssize_t="%zd" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi fi if test ! "$ax_cv_type_fmt_ssize_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* signed: -1 / 2 -> 0 * 0 % 4 -> 0 * 0 - 1 -> -1 * unsigned: 0xff / 2 -> 0x7f * 0x7f % 4 -> 3 * 3 - 1 -> 2 */ int fmtchk[(((ssize_t)-1)/2)%4-1]; unsigned fcs = sizeof(fmtchk); printf("%u\n", fcs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(ssize_t) == sizeof(unsigned int)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { ssize_t testssize_t; sscanf("1234567890", "%u", &testssize_t); printf("%u\n", testssize_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_ssize_t="%u" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test ! "$ax_cv_type_fmt_ssize_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(ssize_t) == sizeof(unsigned long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { ssize_t testssize_t; sscanf("1234567890", "%lu", &testssize_t); printf("%lu\n", testssize_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_ssize_t="%lu" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test ! "$ax_cv_type_fmt_ssize_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(ssize_t) == sizeof(unsigned long long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { ssize_t testssize_t; sscanf("1234567890", "%llu", &testssize_t); printf("%llu\n", testssize_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_ssize_t="%llu" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(ssize_t) == sizeof(int)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { ssize_t testssize_t; sscanf("1234567890", "%d", &testssize_t); printf("%d\n", testssize_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_ssize_t="%d" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test ! "$ax_cv_type_fmt_ssize_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(ssize_t) == sizeof(long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { ssize_t testssize_t; sscanf("1234567890", "%ld", &testssize_t); printf("%ld\n", testssize_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_ssize_t="%ld" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test ! "$ax_cv_type_fmt_ssize_t"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { int sizechk[(sizeof(ssize_t) == sizeof(long long)) * 2 - 1]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { ssize_t testssize_t; sscanf("1234567890", "%lld", &testssize_t); printf("%lld\n", testssize_t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_type_fmt_ssize_t="%lld" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_c_werror_flag="$ax_save_c_werror_flag" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_type_fmt_ssize_t" >&5 $as_echo "$ax_cv_type_fmt_ssize_t" >&6; } if test ! "$ax_cv_type_fmt_ssize_t"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to find format string for ssize_t" >&5 $as_echo "$as_me: WARNING: Unable to find format string for ssize_t" >&2;} else cat >>confdefs.h <<_ACEOF #define FMT_SSIZE_T "$ax_cv_type_fmt_ssize_t" _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct sg_vector needs alignment helper" >&5 $as_echo_n "checking whether struct sg_vector needs alignment helper... " >&6; } if ${ax_cv_alignment_helper_struct_sg_vector+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default struct sg_vector_init_info { size_t item_size; void * init_fn; void * copy_fn; void * compute_diff_fn; void * compare_fn; void * destroy_fn; }; #ifndef NDEBUG struct sg_vector { size_t start_eye; size_t used_count; size_t alloc_count; size_t block_shift; struct sg_vector_init_info info; size_t final_eye; }; #else struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; struct sg_vector_init_info info; }; #endif #if defined(__ICC) && defined(offsetof) # undef offsetof #endif #ifndef offsetof # define offsetof(type,memb) ((unsigned)(((char *)(&((type*)0)->memb)) - ((char *)0))) #endif typedef struct { struct sg_vector a; #ifdef HAVE_UNSIGNED_LONG_LONG_INT unsigned long long b; #else size_t b; #endif } ax_type_alignof_; int main () { int __ax_alignof[(offsetof(ax_type_alignof_, b) == (unsigned long)(((struct sg_vector *)0)+1)) * 2 - 1]; unsigned acs = sizeof(__ax_alignof); printf("%u\n", acs); /* avoid -Wunused ... */ ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_alignment_helper_struct_sg_vector="no" else ax_cv_alignment_helper_struct_sg_vector="yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_alignment_helper_struct_sg_vector" >&5 $as_echo "$ax_cv_alignment_helper_struct_sg_vector" >&6; } if test "$ax_cv_alignment_helper_struct_sg_vector" = "no"; then : $as_echo "#define STRUCT_SG_VECTOR_ALIGN_OK 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unspecified array size for last struct member" >&5 $as_echo_n "checking for unspecified array size for last struct member... " >&6; } if ${ac_cv_unspecified_size_last_struct_member+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default struct foobar { char *nm; unsigned nums[]; }; int main(void) { struct foobar *fbs; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_unspecified_size_last_struct_member="yes" else ac_cv_unspecified_size_last_struct_member="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_unspecified_size_last_struct_member" >&5 $as_echo "$ac_cv_unspecified_size_last_struct_member" >&6; } if test "x$ac_cv_unspecified_size_last_struct_member" = "xyes"; then : $as_echo "#define HAVE_OPEN_ARRAY_AT_STRUCT_END 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for array length of 0" >&5 $as_echo_n "checking for array length of 0... " >&6; } if ${ac_cv_zero_array_size+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default struct foobar { char *nm; unsigned nums[0]; }; int main(void) { struct foobar *fbs; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_zero_array_size="yes" else ac_cv_zero_array_size="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_zero_array_size" >&5 $as_echo "$ac_cv_zero_array_size" >&6; } if test "x$ac_cv_zero_array_size" = "xyes"; then : $as_echo "#define HAVE_ZERO_SIZED_ARRAY 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "struct statvfs" "ac_cv_type_struct_statvfs" " $ac_includes_default #include " if test "x$ac_cv_type_struct_statvfs" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STATVFS 1 _ACEOF fi if test "x$ac_cv_type_struct_statvfs" = "xyes"; then : # NetBSD 2.0 provides extended statvfs ac_fn_c_check_member "$LINENO" "struct statvfs" "f_fstypename" "ac_cv_member_struct_statvfs_f_fstypename" " $ac_includes_default #include " if test "x$ac_cv_member_struct_statvfs_f_fstypename" = xyes; then : $as_echo "#define HAVE_STATVFS_FSTYPENAME /**/" >>confdefs.h fi # Solaris, HP-UX and AIX, too - but other extension ac_fn_c_check_member "$LINENO" "struct statvfs" "f_basetype" "ac_cv_member_struct_statvfs_f_basetype" " $ac_includes_default #include " if test "x$ac_cv_member_struct_statvfs_f_basetype" = xyes; then : $as_echo "#define HAVE_STATVFS_FBASETYPE /**/" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct statvfs" "f_iosize" "ac_cv_member_struct_statvfs_f_iosize" " $ac_includes_default #include " if test "x$ac_cv_member_struct_statvfs_f_iosize" = xyes; then : $as_echo "#define HAVE_STATVFS_FIOSIZE /**/" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct statvfs" "f_frsize" "ac_cv_member_struct_statvfs_f_frsize" " $ac_includes_default #include " if test "x$ac_cv_member_struct_statvfs_f_frsize" = xyes; then : $as_echo "#define HAVE_STATVFS_FFRSIZE /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "struct statvfs64" "ac_cv_type_struct_statvfs64" " $ac_includes_default #include " if test "x$ac_cv_type_struct_statvfs64" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STATVFS64 1 _ACEOF fi if test "x$ac_cv_type_struct_statvfs64" = "xyes"; then : # NetBSD 2.0 provides extended statvfs - does anyone copy this to an statvfs64? ac_fn_c_check_member "$LINENO" "struct statvfs64" "f_fstypename" "ac_cv_member_struct_statvfs64_f_fstypename" " $ac_includes_default #include " if test "x$ac_cv_member_struct_statvfs64_f_fstypename" = xyes; then : $as_echo "#define HAVE_STATVFS64_FSTYPENAME /**/" >>confdefs.h fi # Solaris, HP-UX and AIX, too - but other extension ac_fn_c_check_member "$LINENO" "struct statvfs64" "f_basetype" "ac_cv_member_struct_statvfs64_f_basetype" " $ac_includes_default #include " if test "x$ac_cv_member_struct_statvfs64_f_basetype" = xyes; then : $as_echo "#define HAVE_STATVFS64_FBASETYPE /**/" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct statvfs64" "f_iosize" "ac_cv_member_struct_statvfs64_f_iosize" " $ac_includes_default #include " if test "x$ac_cv_member_struct_statvfs64_f_iosize" = xyes; then : $as_echo "#define HAVE_STATVFS64_FIOSIZE /**/" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct statvfs64" "f_frsize" "ac_cv_member_struct_statvfs64_f_frsize" " $ac_includes_default #include " if test "x$ac_cv_member_struct_statvfs64_f_frsize" = xyes; then : $as_echo "#define HAVE_STATVFS64_FFRSIZE /**/" >>confdefs.h fi fi fi for ac_func in sysfs do : ac_fn_c_check_func "$LINENO" "sysfs" "ac_cv_func_sysfs" if test "x$ac_cv_func_sysfs" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYSFS 1 _ACEOF fi done if test "x$ac_cv_header_utmpx_h" = "xyes"; then : for ac_func in getutxent setutxent endutxent do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_decl "$LINENO" "getutxent" "ac_cv_have_decl_getutxent" "$ac_includes_default #include " if test "x$ac_cv_have_decl_getutxent" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETUTXENT $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "setutxent" "ac_cv_have_decl_setutxent" "$ac_includes_default #include " if test "x$ac_cv_have_decl_setutxent" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_SETUTXENT $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "endutxent" "ac_cv_have_decl_endutxent" "$ac_includes_default #include " if test "x$ac_cv_have_decl_endutxent" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ENDUTXENT $ac_have_decl _ACEOF # FreeBSD 9 (and others) uses utmpx rather than utmp ac_fn_c_check_type "$LINENO" "struct utmpx" "ac_cv_type_struct_utmpx" "#include " if test "x$ac_cv_type_struct_utmpx" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_UTMPX 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct utmpx" "ut_type" "ac_cv_member_struct_utmpx_ut_type" "#include " if test "x$ac_cv_member_struct_utmpx_ut_type" = xyes; then : $as_echo "#define HAVE_UTMPX /**/" >>confdefs.h fi # Some OS support ut_host, too ac_fn_c_check_member "$LINENO" "struct utmpx" "ut_host" "ac_cv_member_struct_utmpx_ut_host" "#include " if test "x$ac_cv_member_struct_utmpx_ut_host" = xyes; then : $as_echo "#define HAVE_UTMPX_HOST /**/" >>confdefs.h fi # ... or have a "significant length of ut_host" ac_fn_c_check_member "$LINENO" "struct utmpx" "ut_syslen" "ac_cv_member_struct_utmpx_ut_syslen" "#include " if test "x$ac_cv_member_struct_utmpx_ut_syslen" = xyes; then : $as_echo "#define HAVE_UTMPX_SYSLEN /**/" >>confdefs.h fi # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of utmpx.ut_id" >&5 $as_echo_n "checking size of utmpx.ut_id... " >&6; } if ${ac_cv_sizeof_utmpx_ut_id+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (utmpx.ut_id))" "ac_cv_sizeof_utmpx_ut_id" "#include "; then : else if test "$ac_cv_type_utmpx_ut_id" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (utmpx.ut_id) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_utmpx_ut_id=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_utmpx_ut_id" >&5 $as_echo "$ac_cv_sizeof_utmpx_ut_id" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_UTMPX_UT_ID $ac_cv_sizeof_utmpx_ut_id _ACEOF fi if test "x$ac_cv_header_utmp_h" = "xyes"; then : for ac_func in setutent endutent getutent do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_decl "$LINENO" "getutent" "ac_cv_have_decl_getutent" "$ac_includes_default #include " if test "x$ac_cv_have_decl_getutent" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_GETUTENT $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "setutent" "ac_cv_have_decl_setutent" "$ac_includes_default #include " if test "x$ac_cv_have_decl_setutent" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_SETUTENT $ac_have_decl _ACEOF ac_fn_c_check_decl "$LINENO" "endutent" "ac_cv_have_decl_endutent" "$ac_includes_default #include " if test "x$ac_cv_have_decl_endutent" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_ENDUTENT $ac_have_decl _ACEOF ac_fn_c_check_type "$LINENO" "struct utmp" "ac_cv_type_struct_utmp" " $ac_includes_default #include " if test "x$ac_cv_type_struct_utmp" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_UTMP 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct utmp" "ut_line" "ac_cv_member_struct_utmp_ut_line" " $ac_includes_default #include " if test "x$ac_cv_member_struct_utmp_ut_line" = xyes; then : $as_echo "#define HAVE_UTMP /**/" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct utmp" "ut_type" "ac_cv_member_struct_utmp_ut_type" " $ac_includes_default #include " if test "x$ac_cv_member_struct_utmp_ut_type" = xyes; then : $as_echo "#define HAVE_UTMP_TYPE /**/" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct utmp" "ut_name" "ac_cv_member_struct_utmp_ut_name" " $ac_includes_default #include " if test "x$ac_cv_member_struct_utmp_ut_name" = xyes; then : $as_echo "#define HAVE_UTMP_NAME /**/" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct utmp" "ut_user" "ac_cv_member_struct_utmp_ut_user" " $ac_includes_default #include " if test "x$ac_cv_member_struct_utmp_ut_user" = xyes; then : $as_echo "#define HAVE_UTMP_USER /**/" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct utmp" "ut_host" "ac_cv_member_struct_utmp_ut_host" " $ac_includes_default #include " if test "x$ac_cv_member_struct_utmp_ut_host" = xyes; then : $as_echo "#define HAVE_UTMP_HOST /**/" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct utmp" "ut_pid" "ac_cv_member_struct_utmp_ut_pid" " $ac_includes_default #include " if test "x$ac_cv_member_struct_utmp_ut_pid" = xyes; then : $as_echo "#define HAVE_UTMP_PID /**/" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct utmp" "ut_id" "ac_cv_member_struct_utmp_ut_id" " $ac_includes_default #include " if test "x$ac_cv_member_struct_utmp_ut_id" = xyes; then : $as_echo "#define HAVE_UTMP_ID /**/" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct utmp" "ut_time" "ac_cv_member_struct_utmp_ut_time" " $ac_includes_default #include " if test "x$ac_cv_member_struct_utmp_ut_time" = xyes; then : $as_echo "#define HAVE_UTMP_TIME /**/" >>confdefs.h fi # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of utmp.ut_id" >&5 $as_echo_n "checking size of utmp.ut_id... " >&6; } if ${ac_cv_sizeof_utmp_ut_id+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (utmp.ut_id))" "ac_cv_sizeof_utmp_ut_id" " $ac_includes_default #include "; then : else if test "$ac_cv_type_utmp_ut_id" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (utmp.ut_id) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_utmp_ut_id=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_utmp_ut_id" >&5 $as_echo "$ac_cv_sizeof_utmp_ut_id" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_UTMP_UT_ID $ac_cv_sizeof_utmp_ut_id _ACEOF fi ax_include_sockets="\ #if HAVE_WINSOCK2_H # include # if HAVE_WS2TCPIP_H # include # endif # if HAVE_WSPIAPI_H # include # endif #elif HAVE_WINSOCK_H /* IIRC winsock.h must be included before windows.h */ # include #else # ifdef HAVE_NETDB_H # include # endif # if HAVE_SYS_TYPES_H # include # endif # ifdef HAVE_SYS_SOCKET_H # include # endif # ifdef HAVE_NETINET_IN_H # include # endif # ifdef HAVE_ARPA_INET_H # include # endif #endif" ac_fn_c_check_member "$LINENO" "struct sockaddr_storage" "ss_family" "ac_cv_member_struct_sockaddr_storage_ss_family" " $ac_includes_default $ax_include_sockets " if test "x$ac_cv_member_struct_sockaddr_storage_ss_family" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 1 _ACEOF fi ac_fn_c_check_member "$LINENO" "struct sockaddr_storage" "__ss_family" "ac_cv_member_struct_sockaddr_storage___ss_family" " $ac_includes_default $ax_include_sockets " if test "x$ac_cv_member_struct_sockaddr_storage___ss_family" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY 1 _ACEOF fi # Default needing setgid/setuid to false if false; then SETGIDBINS_TRUE= SETGIDBINS_FALSE='#' else SETGIDBINS_TRUE='#' SETGIDBINS_FALSE= fi if false; then SETUIDBINS_TRUE= SETUIDBINS_FALSE='#' else SETUIDBINS_TRUE='#' SETUIDBINS_FALSE= fi # Default MINGW setting if false; then MINGW_TRUE= MINGW_FALSE='#' else MINGW_TRUE='#' MINGW_FALSE= fi ENABLE_THREADS_DEFAULT="check" # Set things up for different OS's # We define the name of the OS so the code can act accordingly # We also need to add the right LDFLAGS case $host_os in #( solaris*) : for ac_header in kstat.h libdevinfo.h procfs.h sys/sockio.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done $as_echo "#define SOLARIS 1" >>confdefs.h if true; then SETUIDBINS_TRUE= SETUIDBINS_FALSE='#' else SETUIDBINS_TRUE='#' SETUIDBINS_FALSE= fi BIN_OWNER="root" BIN_PERM="4755" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for kstat_open in -lkstat" >&5 $as_echo_n "checking for kstat_open in -lkstat... " >&6; } if ${ac_cv_lib_kstat_kstat_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lkstat $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char kstat_open (); int main () { return kstat_open (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_kstat_kstat_open=yes else ac_cv_lib_kstat_kstat_open=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_kstat_kstat_open" >&5 $as_echo "$ac_cv_lib_kstat_kstat_open" >&6; } if test "x$ac_cv_lib_kstat_kstat_open" = xyes; then : LINKFLAGS="$LINKFLAGS -lkstat" else as_fn_error $? "need libkstat" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for di_init in -ldevinfo" >&5 $as_echo_n "checking for di_init in -ldevinfo... " >&6; } if ${ac_cv_lib_devinfo_di_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldevinfo $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char di_init (); int main () { return di_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_devinfo_di_init=yes else ac_cv_lib_devinfo_di_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_devinfo_di_init" >&5 $as_echo "$ac_cv_lib_devinfo_di_init" >&6; } if test "x$ac_cv_lib_devinfo_di_init" = xyes; then : LINKFLAGS="$LINKFLAGS -ldevinfo" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fabs in -lm" >&5 $as_echo_n "checking for fabs in -lm... " >&6; } if ${ac_cv_lib_m_fabs+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char fabs (); int main () { return fabs (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_fabs=yes else ac_cv_lib_m_fabs=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_fabs" >&5 $as_echo "$ac_cv_lib_m_fabs" >&6; } if test "x$ac_cv_lib_m_fabs" = xyes; then : SAIDARLIBS="$SAIDARLIBS -lm" fi $as_echo "#define HAVE_PROCFS 1" >>confdefs.h ac_fn_c_check_type "$LINENO" "struct swapent" "ac_cv_type_struct_swapent" " $ac_includes_default #ifdef HAVE_SYS_SWAP_H # include #endif " if test "x$ac_cv_type_struct_swapent" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_SWAPENT 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "struct swaptable" "ac_cv_type_struct_swaptable" " $ac_includes_default #ifdef HAVE_SYS_SWAP_H # include #endif " if test "x$ac_cv_type_struct_swaptable" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_SWAPTABLE 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "struct anoninfo" "ac_cv_type_struct_anoninfo" " $ac_includes_default #ifdef HAVE_SYS_SWAP_H # include #endif " if test "x$ac_cv_type_struct_anoninfo" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_ANONINFO 1 _ACEOF fi ac_cv_threadsafe_strerror="yes" ;; #( hpux11.11*|hpux11.[23]*) : $as_echo "#define HPUX /**/" >>confdefs.h $as_echo "#define HPUX11 /**/" >>confdefs.h for ac_header in sys/pstat.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/pstat.h" "ac_cv_header_sys_pstat_h" "$ac_includes_default" if test "x$ac_cv_header_sys_pstat_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_PSTAT_H 1 _ACEOF else as_fn_error $? "need sys/pstat.h" "$LINENO" 5 fi done for ac_header in sys/dk.h sys/dlpi.h sys/dlpi_ext.h sys/mib.h sys/stropts.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done CPPFLAGS="$CPPFLAGS -D_PSTAT64" ac_cv_threadsafe_strerror="yes" ac_cv_threadsafe_getmntent="yes" ac_fn_c_check_member "$LINENO" "struct pst_diskinfo" "psd_dkbytewrite" "ac_cv_member_struct_pst_diskinfo_psd_dkbytewrite" "#include " if test "x$ac_cv_member_struct_pst_diskinfo_psd_dkbytewrite" = xyes; then : $as_echo "#define HAVE_PST_DISKINFO_PSD_DKBYTEWRITE /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fabs in -lm" >&5 $as_echo_n "checking for fabs in -lm... " >&6; } if ${ac_cv_lib_m_fabs+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char fabs (); int main () { return fabs (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_fabs=yes else ac_cv_lib_m_fabs=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_fabs" >&5 $as_echo "$ac_cv_lib_m_fabs" >&6; } if test "x$ac_cv_lib_m_fabs" = xyes; then : SAIDARLIBS="$SAIDARLIBS -lm" fi ;; #( aix*) : $as_echo "#define AIX /**/" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for perfstat_cpu_total in -lperfstat" >&5 $as_echo_n "checking for perfstat_cpu_total in -lperfstat... " >&6; } if ${ac_cv_lib_perfstat_perfstat_cpu_total+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lperfstat $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char perfstat_cpu_total (); int main () { return perfstat_cpu_total (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_perfstat_perfstat_cpu_total=yes else ac_cv_lib_perfstat_perfstat_cpu_total=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_perfstat_perfstat_cpu_total" >&5 $as_echo "$ac_cv_lib_perfstat_perfstat_cpu_total" >&6; } if test "x$ac_cv_lib_perfstat_perfstat_cpu_total" = xyes; then : LINKFLAGS="$LINKFLAGS -lperfstat" else need libperfstat fi for ac_header in sys/dr.h sys/protosw.h libperfstat.h procinfo.h sys/mntctl.h sys/statfs.h sys/vmount.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" " $ac_includes_default #ifdef HAVE_SYS_DR_H #include #endif #ifdef HAVE_SYS_PROTOSW_H #include #endif " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in mntctl do : ac_fn_c_check_func "$LINENO" "mntctl" "ac_cv_func_mntctl" if test "x$ac_cv_func_mntctl" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MNTCTL 1 _ACEOF fi done ac_fn_c_check_decl "$LINENO" "mntctl" "ac_cv_have_decl_mntctl" " $ac_includes_default #ifdef HAVE_SYS_MNTCTL_H # include #endif #ifdef HAVE_SYS_VMOUNT_H #include #endif " if test "x$ac_cv_have_decl_mntctl" = xyes; then : $as_echo "#define HAVE_DECL_MNTCTL 1" >>confdefs.h fi ac_fn_c_check_decl "$LINENO" "getprocs64" "ac_cv_have_decl_getprocs64" " $ac_includes_default #ifdef HAVE_PROCINFO_H # include #endif " if test "x$ac_cv_have_decl_getprocs64" = xyes; then : $as_echo "#define HAVE_DECL_GETPROCS64 1" >>confdefs.h fi ac_fn_c_check_decl "$LINENO" "getargs" "ac_cv_have_decl_getargs" " $ac_includes_default #ifdef HAVE_PROCINFO_H # include #endif " if test "x$ac_cv_have_decl_getargs" = xyes; then : $as_echo "#define HAVE_DECL_GETARGS 1" >>confdefs.h fi ;; #( freebsd4.*) : $as_echo "#define FREEBSD /**/" >>confdefs.h ;; #( freebsd[5-9].*|freebsd10.*) : $as_echo "#define FREEBSD /**/" >>confdefs.h $as_echo "#define FREEBSD5 /**/" >>confdefs.h ;; #( dragonfly*) : $as_echo "#define DFBSD /**/" >>confdefs.h ENABLE_THREADS_DEFAULT="no" ;; #( kfreebsd*-gnu*) : $as_echo "#define FREEBSD /**/" >>confdefs.h $as_echo "#define FREEBSD5 /**/" >>confdefs.h ;; #( darwin*) : $as_echo "#define DARWIN /**/" >>confdefs.h $as_echo "#define FREEBSD /**/" >>confdefs.h $as_echo "#define FREEBSD5 /**/" >>confdefs.h for element in "-framework IOKit" "-framework CoreFoundation"; do ax_var_contains_found= for x in $LINKFLAGS; do if test "X$x" = "X$element"; then : ax_var_contains_found=yes break fi done if test -n "$ax_var_contains_found"; then : else LINKFLAGS="${LINKFLAGS}${LINKFLAGS:+ }$element" fi done #LINKFLAGS="${LINKFLAGS} -framework IOKit" ;; #( netbsd*) : $as_echo "#define NETBSD /**/" >>confdefs.h ;; #( openbsd*) : $as_echo "#define OPENBSD /**/" >>confdefs.h ;; #( linux-gnu*) : $as_echo "#define LINUX /**/" >>confdefs.h if true; then SETUIDBINS_TRUE= SETUIDBINS_FALSE='#' else SETUIDBINS_TRUE='#' SETUIDBINS_FALSE= fi BIN_OWNER="root" BIN_PERM="4755" $as_echo "#define HAVE_PROCFS 1" >>confdefs.h for ac_header in linux/ethtool.h linux/sockios.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test "x$ac_cv_header_linux_ethtool_h" != "xyes"; then : unset ac_cv_header_linux_ethtool_h ac_safe_cppflags="$CPPFLAGS" CPPFLAGS="-D__u8=uint8_t -D__u16=uint16_t -D__u32=uint32_t -D__u64=uint64_t $CPPFLAGS" ac_fn_c_check_header_mongrel "$LINENO" "linux/ethtool.h" "ac_cv_header_linux_ethtool_h" "$ac_includes_default" if test "x$ac_cv_header_linux_ethtool_h" = xyes; then : fi CPPFLAGS="$ac_safe_cppflags" if test "x$ac_cv_header_linux_ethtool_h" = "xyes"; then : $as_echo "#define LINUX_BROKEN_ETHTOOL_TYPES 1" >>confdefs.h fi fi if test "x$ac_cv_header_linux_ethtool_h" = "xyes"; then : ac_fn_c_check_member "$LINENO" "struct ethtool_cmd" "speed_hi" "ac_cv_member_struct_ethtool_cmd_speed_hi" " $ac_includes_default #ifdef LINUX_BROKEN_ETHTOOL_TYPES # define __u8 uint8_t # define __u16 uint16_t # define __u32 uint32_t # define __u64 uint64_t # include # undef __u8 # undef __u16 # undef __u32 # undef __u64 #endif #ifdef HAVE_LINUX_ETHTOOL_H # include #endif " if test "x$ac_cv_member_struct_ethtool_cmd_speed_hi" = xyes; then : $as_echo "#define HAVE_ETHTOOL_CMD_SPEED_HI 1" >>confdefs.h fi fi ;; #( cygwin) : $as_echo "#define CYGWIN /**/" >>confdefs.h ;; #( mingw32) : $as_echo "#define MINGW /**/" >>confdefs.h $as_echo "#define WINVER 0x0500" >>confdefs.h if true; then MINGW_TRUE= MINGW_FALSE='#' else MINGW_TRUE='#' MINGW_FALSE= fi LINKFLAGS="-lpdh -lIphlpapi -lpsapi -lnetapi32" ;; #( *) : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Build on unknown OS: $host_os - many functions might be not functional" >&5 $as_echo "$as_me: WARNING: Build on unknown OS: $host_os - many functions might be not functional" >&2;} ;; esac case $host_os in #( darwin*) : for ac_header in mach/mach.h do : ac_fn_c_check_header_mongrel "$LINENO" "mach/mach.h" "ac_cv_header_mach_mach_h" "$ac_includes_default" if test "x$ac_cv_header_mach_mach_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MACH_MACH_H 1 _ACEOF fi done if test "x$ac_cv_header_mach_mach_h" != "xyes"; then : for ac_header in mach/mach_host.h mach/vm_statistics.h mach/kern_return.h mach/host_info.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done fi for ac_func in host_statistics host_statistics64 do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done ;; #( *) : ;; esac case $host_os in #( *bsd*|darwin*|dragonfly*) : $as_echo "#define ALLBSD /**/" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD specific features" >&5 $as_echo_n "checking for BSD specific features... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } for ac_header in ifaddrs.h kinfo.h net/if_media.h sys/dkstat.h sys/disk.h sys/iostat.h sys/resource.h sys/sched.h sys/ucred.h sys/user.h uvm/uvm.h sys/vmmeter.h vm/vm_param.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H #include #endif " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for devstat_getnumdevs in -ldevstat" >&5 $as_echo_n "checking for devstat_getnumdevs in -ldevstat... " >&6; } if ${ac_cv_lib_devstat_devstat_getnumdevs+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldevstat $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char devstat_getnumdevs (); int main () { return devstat_getnumdevs (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_devstat_devstat_getnumdevs=yes else ac_cv_lib_devstat_devstat_getnumdevs=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_devstat_devstat_getnumdevs" >&5 $as_echo "$ac_cv_lib_devstat_devstat_getnumdevs" >&6; } if test "x$ac_cv_lib_devstat_devstat_getnumdevs" = xyes; then : LINKFLAGS="$LINKFLAGS -ldevstat" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getnumdevs in -ldevstat" >&5 $as_echo_n "checking for getnumdevs in -ldevstat... " >&6; } if ${ac_cv_lib_devstat_getnumdevs+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldevstat $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char getnumdevs (); int main () { return getnumdevs (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_devstat_getnumdevs=yes else ac_cv_lib_devstat_getnumdevs=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_devstat_getnumdevs" >&5 $as_echo "$ac_cv_lib_devstat_getnumdevs" >&6; } if test "x$ac_cv_lib_devstat_getnumdevs" = xyes; then : LINKFLAGS="$LINKFLAGS -ldevstat" fi for ac_header in devstat.h do : ac_fn_c_check_header_compile "$LINENO" "devstat.h" "ac_cv_header_devstat_h" " $ac_includes_default #if HAVE_SYS_RESOURCE_H # include #endif " if test "x$ac_cv_header_devstat_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DEVSTAT_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for kinfo_get_sched_cputime in -lkinfo" >&5 $as_echo_n "checking for kinfo_get_sched_cputime in -lkinfo... " >&6; } if ${ac_cv_lib_kinfo_kinfo_get_sched_cputime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lkinfo $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char kinfo_get_sched_cputime (); int main () { return kinfo_get_sched_cputime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_kinfo_kinfo_get_sched_cputime=yes else ac_cv_lib_kinfo_kinfo_get_sched_cputime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_kinfo_kinfo_get_sched_cputime" >&5 $as_echo "$ac_cv_lib_kinfo_kinfo_get_sched_cputime" >&6; } if test "x$ac_cv_lib_kinfo_kinfo_get_sched_cputime" = xyes; then : LINKFLAGS="$LINKFLAGS -lkinfo" fi ax_save_libs="$LIBS" LIBS="$LIBS $LINKFLAGS" for ac_func in getfsstat devstat_getdevs devstat_selectdevs getdevs kinfo_get_sched_cputime selectdevs sysctlbyname do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done LIBS="$ax_save_libs" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for properly declared and callable getvfsstat" >&5 $as_echo_n "checking for properly declared and callable getvfsstat... " >&6; } if ${ac_cv_func_getvfsstat+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_func_getvfsstat=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_SYS_DISK_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_STATVFS_H # include #endif int main() { struct statvfs buf; getvfsstat(&buf, sizeof(buf), 0); } _ACEOF if ac_fn_c_try_link "$LINENO"; then : $as_echo "#define HAVE_GETVFSSTAT 1" >>confdefs.h ac_cv_func_getvfsstat=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getvfsstat" >&5 $as_echo "$ac_cv_func_getvfsstat" >&6; } ac_fn_c_check_type "$LINENO" "struct kinfo_proc" "ac_cv_type_struct_kinfo_proc" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_SYS_DISK_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_DKSTAT_H # include #endif #if HAVE_SYS_RESOURCE_H # include #endif #ifdef HAVE_DEVSTAT_H # include #endif #ifdef HAVE_KINFO_H # include #endif " if test "x$ac_cv_type_struct_kinfo_proc" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_KINFO_PROC 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "struct kinfo_proc2" "ac_cv_type_struct_kinfo_proc2" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_SYS_DISK_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_DKSTAT_H # include #endif #if HAVE_SYS_RESOURCE_H # include #endif #ifdef HAVE_DEVSTAT_H # include #endif #ifdef HAVE_KINFO_H # include #endif " if test "x$ac_cv_type_struct_kinfo_proc2" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_KINFO_PROC2 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "struct io_sysctl" "ac_cv_type_struct_io_sysctl" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_SYS_DISK_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_DKSTAT_H # include #endif #if HAVE_SYS_RESOURCE_H # include #endif #ifdef HAVE_DEVSTAT_H # include #endif #ifdef HAVE_KINFO_H # include #endif " if test "x$ac_cv_type_struct_io_sysctl" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_IO_SYSCTL 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "struct diskstats" "ac_cv_type_struct_diskstats" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_SYS_DISK_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_DKSTAT_H # include #endif #if HAVE_SYS_RESOURCE_H # include #endif #ifdef HAVE_DEVSTAT_H # include #endif #ifdef HAVE_KINFO_H # include #endif " if test "x$ac_cv_type_struct_diskstats" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_DISKSTATS 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "struct disk_sysctl" "ac_cv_type_struct_disk_sysctl" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_SYS_DISK_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_DKSTAT_H # include #endif #if HAVE_SYS_RESOURCE_H # include #endif #ifdef HAVE_DEVSTAT_H # include #endif #ifdef HAVE_KINFO_H # include #endif " if test "x$ac_cv_type_struct_disk_sysctl" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_DISK_SYSCTL 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "struct devstat" "ac_cv_type_struct_devstat" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_SYS_DISK_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_DKSTAT_H # include #endif #if HAVE_SYS_RESOURCE_H # include #endif #ifdef HAVE_DEVSTAT_H # include #endif #ifdef HAVE_KINFO_H # include #endif " if test "x$ac_cv_type_struct_devstat" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_DEVSTAT 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "struct statinfo" "ac_cv_type_struct_statinfo" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_SYS_DISK_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_DKSTAT_H # include #endif #if HAVE_SYS_RESOURCE_H # include #endif #ifdef HAVE_DEVSTAT_H # include #endif #ifdef HAVE_KINFO_H # include #endif " if test "x$ac_cv_type_struct_statinfo" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STATINFO 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "struct kinfo_cputime" "ac_cv_type_struct_kinfo_cputime" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_KINFO_H # include #endif " if test "x$ac_cv_type_struct_kinfo_cputime" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_KINFO_CPUTIME 1 _ACEOF fi if test "x$ac_cv_type_struct_io_sysctl" = "xyes"; then : ac_fn_c_check_member "$LINENO" "struct io_sysctl" "name" "ac_cv_member_struct_io_sysctl_name" " $ac_includes_default #include " if test "x$ac_cv_member_struct_io_sysctl_name" = xyes; then : $as_echo "#define HAVE_IO_SYSCTL_NAME 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Probably better stop building libstatgrab when playing with statistic API" >&5 $as_echo "$as_me: WARNING: Probably better stop building libstatgrab when playing with statistic API" >&2;} fi fi if test "x$ac_cv_type_struct_disk_sysctl" = "xyes"; then : # Disk IO read and write statistics are only present on recent NetBSD # read: everyting beyond NetBSD 1.6 ac_fn_c_check_member "$LINENO" "struct disk_sysctl" "dk_rbytes" "ac_cv_member_struct_disk_sysctl_dk_rbytes" " $ac_includes_default #include " if test "x$ac_cv_member_struct_disk_sysctl_dk_rbytes" = xyes; then : $as_echo "#define HAVE_DISK_SYSCTL_DK_RBYTES /**/" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct disk_sysctl" "dk_name" "ac_cv_member_struct_disk_sysctl_dk_name" " $ac_includes_default #include " if test "x$ac_cv_member_struct_disk_sysctl_dk_name" = xyes; then : $as_echo "#define HAVE_DISK_SYSCTL_DK_RBYTES /**/" >>confdefs.h fi fi if test "x$ac_cv_type_struct_devstat" = "xyes"; then : ac_fn_c_check_member "$LINENO" "struct devstat" "bytes" "ac_cv_member_struct_devstat_bytes" " $ac_includes_default #if HAVE_SYS_RESOURCE_H # include #endif #ifdef HAVE_DEVSTAT_H # include #endif " if test "x$ac_cv_member_struct_devstat_bytes" = xyes; then : $as_echo "#define HAVE_DEVSTAT_BYTES 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct devstat" "bytes_read" "ac_cv_member_struct_devstat_bytes_read" " $ac_includes_default #if HAVE_SYS_RESOURCE_H # include #endif #ifdef HAVE_DEVSTAT_H # include #endif " if test "x$ac_cv_member_struct_devstat_bytes_read" = xyes; then : $as_echo "#define HAVE_DEVSTAT_BYTES_READ 1" >>confdefs.h fi fi if test "x$ac_cv_type_struct_diskstats" = "xyes"; then : # Disk IO read and write statistics are only present on recent OpenBSD. ac_fn_c_check_member "$LINENO" "struct diskstats" "ds_rbytes" "ac_cv_member_struct_diskstats_ds_rbytes" " $ac_includes_default #include " if test "x$ac_cv_member_struct_diskstats_ds_rbytes" = xyes; then : $as_echo "#define HAVE_DISKSTAT_DS_RBYTES /**/" >>confdefs.h fi # Disk IO statistics have disknames only on recent OpenBSD. ac_fn_c_check_member "$LINENO" "struct diskstats" "ds_name" "ac_cv_member_struct_diskstats_ds_name" " $ac_includes_default #include " if test "x$ac_cv_member_struct_diskstats_ds_name" = xyes; then : $as_echo "#define HAVE_DISKSTAT_DS_NAME /**/" >>confdefs.h fi fi if test "x$ac_cv_type_struct_kinfo_proc" = "xyes" -a "x$ac_cv_type_struct_kinfo_proc2" != "xyes"; then : ac_fn_c_check_member "$LINENO" "struct kinfo_proc" "kp_proc" "ac_cv_member_struct_kinfo_proc_kp_proc" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_KINFO_H # include #endif " if test "x$ac_cv_member_struct_kinfo_proc_kp_proc" = xyes; then : $as_echo "#define HAVE_KINFO_PROC_KP_PROC 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct kinfo_proc" "kp_thread" "ac_cv_member_struct_kinfo_proc_kp_thread" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_KINFO_H # include #endif " if test "x$ac_cv_member_struct_kinfo_proc_kp_thread" = xyes; then : $as_echo "#define HAVE_KINFO_PROC_KP_THREAD 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct kinfo_proc" "kp_eproc" "ac_cv_member_struct_kinfo_proc_kp_eproc" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_KINFO_H # include #endif " if test "x$ac_cv_member_struct_kinfo_proc_kp_eproc" = xyes; then : $as_echo "#define HAVE_KINFO_PROC_KP_EPROC 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct kinfo_proc" "kp_eproc.e_ucred.cr_ruid" "ac_cv_member_struct_kinfo_proc_kp_eproc_e_ucred_cr_ruid" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_KINFO_H # include #endif " if test "x$ac_cv_member_struct_kinfo_proc_kp_eproc_e_ucred_cr_ruid" = xyes; then : $as_echo "#define HAVE_KINFO_PROC_KP_EPROC_E_UCRED_CR_RUID 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct kinfo_proc" "ki_stat" "ac_cv_member_struct_kinfo_proc_ki_stat" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_KINFO_H # include #endif " if test "x$ac_cv_member_struct_kinfo_proc_ki_stat" = xyes; then : $as_echo "#define HAVE_KINFO_PROC_KI_STAT 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct kinfo_proc" "p_stat" "ac_cv_member_struct_kinfo_proc_p_stat" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_KINFO_H # include #endif " if test "x$ac_cv_member_struct_kinfo_proc_p_stat" = xyes; then : $as_echo "#define HAVE_KINFO_PROC_P_STAT 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct kinfo_proc" "p_vm_map_size" "ac_cv_member_struct_kinfo_proc_p_vm_map_size" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_KINFO_H # include #endif " if test "x$ac_cv_member_struct_kinfo_proc_p_vm_map_size" = xyes; then : $as_echo "#define HAVE_KINFO_PROC_P_VM_MAP_SIZE 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct kinfo_proc" "ki_structsize" "ac_cv_member_struct_kinfo_proc_ki_structsize" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_KINFO_H # include #endif " if test "x$ac_cv_member_struct_kinfo_proc_ki_structsize" = xyes; then : $as_echo "#define HAVE_KINFO_PROC_KP_THREAD 1" >>confdefs.h fi fi ac_fn_c_check_member "$LINENO" "struct kinfo_proc" "kp_pid" "ac_cv_member_struct_kinfo_proc_kp_pid" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_KINFO_H # include #endif " if test "x$ac_cv_member_struct_kinfo_proc_kp_pid" = xyes; then : $as_echo "#define HAVE_KINFO_PROC_KP_PID 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct kinfo_proc" "p_pid" "ac_cv_member_struct_kinfo_proc_p_pid" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_KINFO_H # include #endif " if test "x$ac_cv_member_struct_kinfo_proc_p_pid" = xyes; then : $as_echo "#define HAVE_KINFO_PROC_P_PID 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "struct uvmexp_sysctl" "ac_cv_type_struct_uvmexp_sysctl" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_SYSCTL_H #include #endif #ifdef HAVE_UVM_UVM_H #include #endif " if test "x$ac_cv_type_struct_uvmexp_sysctl" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_UVMEXP_SYSCTL 1 _ACEOF fi if test "x$ac_cv_type_struct_uvmexp_sysctl" != "xyes"; then : ac_fn_c_check_type "$LINENO" "struct uvmexp" "ac_cv_type_struct_uvmexp" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_SYSCTL_H #include #endif #ifdef HAVE_UVM_UVM_H #include #endif " if test "x$ac_cv_type_struct_uvmexp" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_UVMEXP 1 _ACEOF fi if test "x$ac_cv_type_struct_uvmexp" = "xyes"; then : ac_fn_c_check_member "$LINENO" "struct uvmexp" "swtch" "ac_cv_member_struct_uvmexp_swtch" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_SYSCTL_H #include #endif #ifdef HAVE_UVM_UVM_H #include #endif " if test "x$ac_cv_member_struct_uvmexp_swtch" = xyes; then : $as_echo "#define HAVE_STRUCT_UVMEXP_SWTCH /**/" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct uvmexp" "filepages" "ac_cv_member_struct_uvmexp_filepages" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_SYSCTL_H #include #endif #ifdef HAVE_UVM_UVM_H #include #endif " if test "x$ac_cv_member_struct_uvmexp_filepages" = xyes; then : $as_echo "#define HAVE_STRUCT_UVMEXP_FILEPAGES /**/" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct uvmexp" "execpages" "ac_cv_member_struct_uvmexp_execpages" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_SYSCTL_H #include #endif #ifdef HAVE_UVM_UVM_H #include #endif " if test "x$ac_cv_member_struct_uvmexp_execpages" = xyes; then : $as_echo "#define HAVE_STRUCT_UVMEXP_EXECPAGES /**/" >>confdefs.h fi fi fi ac_fn_c_check_type "$LINENO" "struct vmtotal" "ac_cv_type_struct_vmtotal" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_SYSCTL_H #include #endif #ifdef HAVE_SYS_VMMETER_H #include #endif " if test "x$ac_cv_type_struct_vmtotal" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_VMTOTAL 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "struct vmmeter" "ac_cv_type_struct_vmmeter" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_SYSCTL_H #include #endif #ifdef HAVE_SYS_VMMETER_H #include #endif " if test "x$ac_cv_type_struct_vmmeter" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_VMMETER 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "struct xswdev" "ac_cv_type_struct_xswdev" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_SYSCTL_H #include #endif #ifdef HAVE_VM_VM_PARAM_H #include #endif " if test "x$ac_cv_type_struct_xswdev" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_XSWDEV 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "struct xsw_usage" "ac_cv_type_struct_xsw_usage" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_SYSCTL_H #include #endif #ifdef HAVE_VM_VM_PARAM_H #include #endif " if test "x$ac_cv_type_struct_xsw_usage" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_XSW_USAGE 1 _ACEOF fi if test "x$ac_cv_type_struct_xswdev" = "xyes"; then : ac_fn_c_check_member "$LINENO" "struct xswdev" "xsw_size" "ac_cv_member_struct_xswdev_xsw_size" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_SYSCTL_H #include #endif #ifdef HAVE_VM_VM_PARAM_H #include #endif " if test "x$ac_cv_member_struct_xswdev_xsw_size" = xyes; then : $as_echo "#define HAVE_STRUCT_XSWDEV_SIZE /**/" >>confdefs.h fi fi ac_fn_c_check_type "$LINENO" "struct xvfsconf" "ac_cv_type_struct_xvfsconf" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_SYSCTL_H #include #endif #ifdef HAVE_SYS_MOUNT_H #include #endif " if test "x$ac_cv_type_struct_xvfsconf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_XVFSCONF 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "struct vfsconf" "ac_cv_type_struct_vfsconf" " $ac_includes_default #ifdef HAVE_SYS_PARAM_H #include #endif #ifdef HAVE_SYS_SYSCTL_H #include #endif #ifdef HAVE_SYS_MOUNT_H #include #endif " if test "x$ac_cv_type_struct_vfsconf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_VFSCONF 1 _ACEOF fi ;; #( *) : ;; esac if test "x$ac_cv_func_getmntent" = "xyes" -o "x$ac_cv_func_getmntent_r" = "xyes"; then : # Check whether --with-mnttab was given. if test "${with_mnttab+set}" = set; then : withval=$with_mnttab; WITH_MNTTAB="$withval" else WITH_MNTTAB="check" fi ac_fn_c_check_decl "$LINENO" "MNT_MNTTAB" "ac_cv_have_decl_MNT_MNTTAB" " $ac_includes_default #ifdef HAVE_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTTAB_H # include #endif " if test "x$ac_cv_have_decl_MNT_MNTTAB" = xyes; then : else if test "x$cross_compiling" = "xyes"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for /etc/mnttab" >&5 $as_echo_n "checking for /etc/mnttab... " >&6; } if ${ac_cv_file__etc_mnttab+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "/etc/mnttab"; then ac_cv_file__etc_mnttab=yes else ac_cv_file__etc_mnttab=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file__etc_mnttab" >&5 $as_echo "$ac_cv_file__etc_mnttab" >&6; } if test "x$ac_cv_file__etc_mnttab" = xyes; then : cat >>confdefs.h <<_ACEOF #define MNT_MNTTAB "/etc/mnttab" _ACEOF else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for /etc/mtab" >&5 $as_echo_n "checking for /etc/mtab... " >&6; } if ${ac_cv_file__etc_mtab+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "/etc/mtab"; then ac_cv_file__etc_mtab=yes else ac_cv_file__etc_mtab=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_file__etc_mtab" >&5 $as_echo "$ac_cv_file__etc_mtab" >&6; } if test "x$ac_cv_file__etc_mtab" = xyes; then : cat >>confdefs.h <<_ACEOF #define MNT_MNTTAB "/etc/mtab" _ACEOF fi fi fi fi ac_fn_c_check_decl "$LINENO" "setmntent" "ac_cv_have_decl_setmntent" " $ac_includes_default #ifdef HAVE_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTTAB_H # include #endif " if test "x$ac_cv_have_decl_setmntent" = xyes; then : $as_echo "#define HAVE_DECL_SETMNTENT 1" >>confdefs.h fi ac_fn_c_check_decl "$LINENO" "endmntent" "ac_cv_have_decl_endmntent" " $ac_includes_default #ifdef HAVE_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTTAB_H # include #endif " if test "x$ac_cv_have_decl_endmntent" = xyes; then : $as_echo "#define HAVE_DECL_ENDMNTENT 1" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "struct mntent" "ac_cv_type_struct_mntent" " $ac_includes_default #ifdef HAVE_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTTAB_H # include #endif " if test "x$ac_cv_type_struct_mntent" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_MNTENT 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "struct mnttab" "ac_cv_type_struct_mnttab" " $ac_includes_default #ifdef HAVE_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTTAB_H # include #endif " if test "x$ac_cv_type_struct_mnttab" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_MNTTAB 1 _ACEOF fi if test "x$ac_cv_func_getmntent" = "xyes"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking apparent thread safety of getmntent" >&5 $as_echo_n "checking apparent thread safety of getmntent... " >&6; } if ${ac_cv_threadsafe_getmntent+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #ifdef HAVE_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTTAB_H # include #endif int main(void) { FILE *f; #if defined(HAVE_STRUCT_MNTENT) struct mntent mp; #elif defined(HAVE_STRUCT_MNTTAB) struct mnttab mp; #endif int rc; rc = getmntent(f, &mp); return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_threadsafe_getmntent="yes" else ac_cv_threadsafe_getmntent="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_threadsafe_getmntent" >&5 $as_echo "$ac_cv_threadsafe_getmntent" >&6; } if test "x$ac_cv_threadsafe_getmntent" = "xyes"; then : $as_echo "#define HAVE_THREADSAFE_GETMNTENT 1" >>confdefs.h fi fi if test "x$ac_cv_func_getmntent_r" = "xyes"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of getmntent_r" >&5 $as_echo_n "checking return type of getmntent_r... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #ifdef HAVE_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTTAB_H # include #endif int main(void) { FILE *f; struct mntent mp; char buf[1024]; int rc; rc = getmntent_r(f, &mp, buf, sizeof(buf)) % 10; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: int" >&5 $as_echo "int" >&6; } $as_echo "#define GETMNTENT_R_RETURN_INT 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: struct mntent *" >&5 $as_echo "struct mntent *" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi fi ac_fn_c_check_type "$LINENO" "struct statfs" "ac_cv_type_struct_statfs" " $ac_includes_default #ifdef HAVE_SYS_VFS_H # include #endif #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_MOUNT_H # include #endif #ifdef HAVE_SYS_STATFS_H # include #endif " if test "x$ac_cv_type_struct_statfs" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STATFS 1 _ACEOF fi if test "x$ac_cv_type_struct_statfs" = "xyes"; then : # check for several uncommon fields of struct statfs ac_fn_c_check_member "$LINENO" "struct statfs" "f_favail" "ac_cv_member_struct_statfs_f_favail" " $ac_includes_default #ifdef HAVE_SYS_VFS_H # include #endif #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_MOUNT_H # include #endif #ifdef HAVE_SYS_STATFS_H # include #endif " if test "x$ac_cv_member_struct_statfs_f_favail" = xyes; then : $as_echo "#define HAVE_STATFS_FFAVAIL /**/" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct statfs" "f_iosize" "ac_cv_member_struct_statfs_f_iosize" " $ac_includes_default #ifdef HAVE_SYS_VFS_H # include #endif #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_MOUNT_H # include #endif #ifdef HAVE_SYS_STATFS_H # include #endif " if test "x$ac_cv_member_struct_statfs_f_iosize" = xyes; then : $as_echo "#define HAVE_STATFS_FIOSIZE /**/" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct statfs" "f_frsize" "ac_cv_member_struct_statfs_f_frsize" " $ac_includes_default #ifdef HAVE_SYS_VFS_H # include #endif #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_MOUNT_H # include #endif #ifdef HAVE_SYS_STATFS_H # include #endif " if test "x$ac_cv_member_struct_statfs_f_frsize" = xyes; then : $as_echo "#define HAVE_STATFS_FFRSIZE /**/" >>confdefs.h fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to control symbol visibility" >&5 $as_echo_n "checking how to control symbol visibility... " >&6; } if ${ax_cv_visibility+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag="$ac_c_werror_flag" ac_c_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int __attribute__ ((visibility("default"))) foo() { return 1; } int __attribute__ ((visibility("hidden"))) bar() { return 1; } int __attribute__ ((visibility("private"))) baz() { return 1; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_visibility="gcc4" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int __attribute__ ((dllexport)) foo() { return 1; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_visibility="gcc3" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int __hidden foo() { return 1; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_visibility="sunpro" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int __declspec(dllexport) foo() { return 1; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_visibility="ms" else ax_cv_visibility="unknown" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag="$ac_save_c_werror_flag" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_visibility" >&5 $as_echo "$ax_cv_visibility" >&6; } case $ax_cv_visibility in #( gcc4) : ax_visibility_export='__attribute__((visibility("default")))' ax_visibility_import='__attribute__((visibility("default")))' ax_visibility_private='__attribute__((visibility("hidden")))' ;; #( gcc3) : ax_visibility_export='__attribute__((dllexport))' ax_visibility_import='__attribute__((dllimport))' ax_visibility_private='' ;; #( sunpro) : ax_visibility_export='__global' ax_visibility_import='__global' ax_visibility_private='__hidden' ;; #( ms) : ax_visibility_export='__declspec(dllexport)' ax_visibility_import='__declspec(dllimport)' ax_visibility_private='' ;; #( *) : ax_visibility_export='' ax_visibility_import='' ax_visibility_private='' ;; esac if test "x$ax_cv_visibility" != "xunknown"; then : SG_EXPORT="$ax_visibility_export" SG_IMPORT="$ax_visibility_import" SG_PRIVATE="$ax_visibility_private" WITH_VISIBILITY_SUPPORT=1 else WITH_VISIBILITY_SUPPORT=0 fi # User specified curses/ncurses prefix # Check whether --with-curses-prefix was given. if test "${with_curses_prefix+set}" = set; then : withval=$with_curses_prefix; if test -d "$withval/lib"; then SAIDARLIBS="-L${withval}/lib ${SAIDARLIBS}" fi if test -d "$withval/include"; then SAIDARCPPFLAGS="-I${withval}/include ${SAIRDARCPPFLAGS}" fi fi # Check if user wants to disable statgrab if true; then STATGRAB_TRUE= STATGRAB_FALSE='#' else STATGRAB_TRUE='#' STATGRAB_FALSE= fi # Check whether --enable-statgrab was given. if test "${enable_statgrab+set}" = set; then : enableval=$enable_statgrab; if test "x$enableval" = "xno" ; then if false; then STATGRAB_TRUE= STATGRAB_FALSE='#' else STATGRAB_TRUE='#' STATGRAB_FALSE= fi fi fi # Check if user wants to disable saidar if true; then SAIDAR_TRUE= SAIDAR_FALSE='#' else SAIDAR_TRUE='#' SAIDAR_FALSE= fi # Check whether --enable-saidar was given. if test "${enable_saidar+set}" = set; then : enableval=$enable_saidar; if test "x$enableval" = "xno" ; then if false; then SAIDAR_TRUE= SAIDAR_FALSE='#' else SAIDAR_TRUE='#' SAIDAR_FALSE= fi fi else # saidar needs curses # (if we don't find curses we disable saidar) # Check whether --with-ncurses was given. if test "${with_ncurses+set}" = set; then : withval=$with_ncurses; fi mp_save_LIBS="$LIBS" mp_save_CPPFLAGS="$CPPFLAGS" CURSES_LIB="" if test "x$with_ncurses" != "xno"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working ncurses" >&5 $as_echo_n "checking for working ncurses... " >&6; } if ${mp_cv_ncurses+:} false; then : $as_echo_n "(cached) " >&6 else LIBS="$mp_save_LIBS $SAIDARLIBS -lncurses" CPPFLAGS="$mp_save_CPPFLAGS $SAIDARCPPFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { chtype a; int b=A_STANDOUT, c=KEY_LEFT; initscr(); addchnstr(&a, b); move(b,c); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : mp_cv_ncurses="ncurses.h" CURSES_LIB="-lncurses" else LIBS="$mp_save_LIBS $SAIDARLIBS -lncurses" CPPFLAGS="$mp_save_CPPFLAGS $SAIDARCPPFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { chtype a; int b=A_STANDOUT, c=KEY_LEFT; initscr(); addchnstr(&a, b); move(b,c); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : mp_cv_ncurses="ncurses/ncurses.h" CURSES_LIB="-lncurses" else LIBS="$mp_save_LIBS $SAIDARLIBS -lcurses" CPPFLAGS="$mp_save_CPPFLAGS $SAIDARCPPFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { chtype a; int b=A_STANDOUT, c=KEY_LEFT; initscr(); addchnstr(&a, b); move(b,c); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : mp_cv_ncurses="curses.h" CURSES_LIB="-lcurses" else mp_cv_ncurses=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mp_cv_ncurses" >&5 $as_echo "$mp_cv_ncurses" >&6; } fi if test ! "$CURSES_LIB"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to find curses or ncurses; disabling saidar" >&5 $as_echo "$as_me: WARNING: Unable to find curses or ncurses; disabling saidar" >&2;} if false; then SAIDAR_TRUE= SAIDAR_FALSE='#' else SAIDAR_TRUE='#' SAIDAR_FALSE= fi elif test "$mp_cv_ncurses" = "ncurses.h"; then : $as_echo "#define HAVE_NCURSES_H 1" >>confdefs.h elif test "$mp_cv_ncurses" = "ncurses/ncurses.h"; then : $as_echo "#define HAVE_NCURSES_NCURSES_H 1" >>confdefs.h elif test "$mp_cv_ncurses" = "curses.h"; then : $as_echo "#define HAVE_CURSES_H 1" >>confdefs.h fi SAIDARLIBS="$SAIDARLIBS $CURSES_LIB" LIBS="$mp_save_LIBS" CPPFLAGS="$mp_save_CPPFLAGS" for ac_header in termios.h sys/termios.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done fi # Check if the user would prefer not to build examples if true; then EXAMPLES_TRUE= EXAMPLES_FALSE='#' else EXAMPLES_TRUE='#' EXAMPLES_FALSE= fi # Check whether --enable-examples was given. if test "${enable_examples+set}" = set; then : enableval=$enable_examples; if test "x$enableval" = "xno" ; then if false; then EXAMPLES_TRUE= EXAMPLES_FALSE='#' else EXAMPLES_TRUE='#' EXAMPLES_FALSE= fi fi fi # Check if user wants to make and install manpages # XXX split between make and install # Check whether --enable-man-build was given. if test "${enable_man_build+set}" = set; then : enableval=$enable_man_build; ENABLE_BUILD_MANPAGES="${enableval}" else if test "x$USE_MAINTAINER_MODE" = "xyes"; then : ENABLE_BUILD_MANPAGES="yes" else ENABLE_BUILD_MANPAGES="check" fi fi if false; then BUILD_MANPAGES_TRUE= BUILD_MANPAGES_FALSE='#' else BUILD_MANPAGES_TRUE='#' BUILD_MANPAGES_FALSE= fi if test "x${ENABLE_MANPAGES}" = "xno"; then : if false; then BUILD_MANPAGES_TRUE= BUILD_MANPAGES_FALSE='#' else BUILD_MANPAGES_TRUE='#' BUILD_MANPAGES_FALSE= fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for applicable docbook2man" >&5 $as_echo_n "checking for applicable docbook2man... " >&6; } if test -z "$docbook2man_prog"; then ac_path_docbook2man_prog_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in docbook2x-man docbook2man; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_docbook2man_prog="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_docbook2man_prog" || continue output=`$ac_path_docbook2man_prog --help 2>/dev/null | grep "Convert DocBook XML documents to man pages"` if test -n "$output"; then : ac_path_docbook2man_prog_found=: ac_cv_path_docbook2man_prog="$ac_path_docbook2man_prog" fi $ac_path_docbook2man_prog_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_docbook2man_prog"; then docbook2man_prog="none" ac_cv_path_docbook2man_prog="none" fi else ac_cv_path_docbook2man_prog=$docbook2man_prog fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_docbook2man_prog" >&5 $as_echo "$ac_cv_path_docbook2man_prog" >&6; } if test "x$enableval" = "xyes" -a "x$ac_cv_path_docbook2man_prog" = "xnone"; then : as_fn_error $? "Want manpages being build but have no docbook2man" "$LINENO" 5 elif test "x$ac_cv_path_docbook2man_prog" != "xnone"; then : if true; then BUILD_MANPAGES_TRUE= BUILD_MANPAGES_FALSE='#' else BUILD_MANPAGES_TRUE='#' BUILD_MANPAGES_FALSE= fi DOCBOOK2MAN="$ac_cv_path_docbook2man_prog" { $as_echo "$as_me:${as_lineno-$LINENO}: enabling build of manpages using $DOCBOOK2MAN" >&5 $as_echo "$as_me: enabling build of manpages using $DOCBOOK2MAN" >&6;} fi fi # Check if user wants to make tests # Check whether --enable-tests was given. if test "${enable_tests+set}" = set; then : enableval=$enable_tests; ENABLE_TESTS="${enableval}" else if test "x$USE_MAINTAINER_MODE" = "xyes"; then : ENABLE_TESTS="yes" else ENABLE_TESTS="check" fi fi if false; then TESTS_TRUE= TESTS_FALSE='#' else TESTS_TRUE='#' TESTS_FALSE= fi if false; then TEST_SCRIPTS_TRUE= TEST_SCRIPTS_FALSE='#' else TEST_SCRIPTS_TRUE='#' TEST_SCRIPTS_FALSE= fi # Check whether --with-perl5 was given. if test "${with_perl5+set}" = set; then : withval=$with_perl5; $as_test_x "$withval" && ax_perl5_prog="$withval" fi if test "x$ENABLE_TESTS" != "xno"; then : if true; then TESTS_TRUE= TESTS_FALSE='#' else TESTS_TRUE='#' TESTS_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for applicable perl5 interpreter" >&5 $as_echo_n "checking for applicable perl5 interpreter... " >&6; } if ${ax_cv_perl5_prog+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$ax_perl5_prog"; then ac_path_ax_perl5_prog_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in perl5 perl; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_ax_perl5_prog="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_ax_perl5_prog" || continue output=`$ac_path_ax_perl5_prog -e 'use 5.006;' -e 'use Getopt::Long;' -e 'use Test::More; Test::More->VERSION() > 0.90 or die "Test::More 0.90 required--this is only " . Test::More->VERSION();' -e 'use Data::Dumper;' -e 'use IPC::Cmd;' -V 2>/dev/null` if test $? -eq 0; then : ax_perl5_prog="$ac_path_ax_perl5_prog " ac_cv_path_ax_perl5_prog="$ax_perl5_prog" ac_path_ax_perl5_prog_found=: fi $ac_path_ax_perl5_prog_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_ax_perl5_prog"; then ax_perl5_prog="none" fi else ac_cv_path_ax_perl5_prog=$ax_perl5_prog fi ax_cv_perl5_prog="$ax_perl5_prog" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_perl5_prog" >&5 $as_echo "$ax_cv_perl5_prog" >&6; } PERL5="$ax_cv_perl5_prog" if test "x$PERL5" != "xnone"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: enabling build of test automation using $PERL5" >&5 $as_echo "$as_me: enabling build of test automation using $PERL5" >&6;} if true; then TEST_SCRIPTS_TRUE= TEST_SCRIPTS_FALSE='#' else TEST_SCRIPTS_TRUE='#' TEST_SCRIPTS_FALSE= fi else if test "x$ENABLE_TESTS" = "xyes"; then : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Tests are required but no suitable Perl5 environment found See \`config.log' for more details" "$LINENO" 5; } fi fi fi # Check if the user wants to turn on setgid binaries # If they specify nothing disable them # Check whether --enable-setgid-binaries was given. if test "${enable_setgid_binaries+set}" = set; then : enableval=$enable_setgid_binaries; if test "x$enableval" = "xno" ; then if false; then SETGIDBINS_TRUE= SETGIDBINS_FALSE='#' else SETGIDBINS_TRUE='#' SETGIDBINS_FALSE= fi fi else if false; then SETGIDBINS_TRUE= SETGIDBINS_FALSE='#' else SETGIDBINS_TRUE='#' SETGIDBINS_FALSE= fi fi # Check if the user wants to turn on setuid binaries # If they specify nothing disable them # Check whether --enable-setuid-binaries was given. if test "${enable_setuid_binaries+set}" = set; then : enableval=$enable_setuid_binaries; if test "x$enableval" = "xno" ; then if false; then SETUIDBINS_TRUE= SETUIDBINS_FALSE='#' else SETUIDBINS_TRUE='#' SETUIDBINS_FALSE= fi fi else if false; then SETUIDBINS_TRUE= SETUIDBINS_FALSE='#' else SETUIDBINS_TRUE='#' SETUIDBINS_FALSE= fi fi # Check if the user wants to support access from multiple threads # Check whether --enable-thread-support was given. if test "${enable_thread_support+set}" = set; then : enableval=$enable_thread_support; ENABLE_THREADS="$enableval" else ENABLE_THREADS="$ENABLE_THREADS_DEFAULT" fi if test "x$ac_cv_func_strerror_r" = "xyes"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of strerror_r" >&5 $as_echo_n "checking return type of strerror_r... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main(void) { char buf[1024]; int rc; rc = strerror_r(1, buf, sizeof(buf)) % 10; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: int" >&5 $as_echo "int" >&6; } $as_echo "#define STRERROR_R_RETURN_INT 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: char *" >&5 $as_echo "char *" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if false; then ENABLE_THREADS_TRUE= ENABLE_THREADS_FALSE='#' else ENABLE_THREADS_TRUE='#' ENABLE_THREADS_FALSE= fi WITH_THREADS_CONFIGURED=0 if test "x${ENABLE_THREADS}" != "xno"; then : ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiling for native Win32" >&5 $as_echo_n "checking whether compiling for native Win32... " >&6; } if ${ax_cv_native_win32+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef _WIN32 #error "Not Win32" #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ax_cv_native_win32=yes else ax_cv_native_win32=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_native_win32" >&5 $as_echo "$ax_cv_native_win32" >&6; } # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$ax_cv_native_win32" = xyes; then : $as_echo "#define ENABLE_THREADS 1" >>confdefs.h WITH_THREADS_CONFIGURED=1 if true; then ENABLE_THREADS_TRUE= ENABLE_THREADS_FALSE='#' else ENABLE_THREADS_TRUE='#' ENABLE_THREADS_FALSE= fi else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 $as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_join (); int main () { return pthread_join (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_pthread_ok=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 $as_echo "$ax_pthread_ok" >&6; } if test x"$ax_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items starting with a "-" are # C compiler flags, and other items are library names, except for "none" # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. ax_pthread_flags="-Kthread -kthread lthread -pthread -pthreads -mt -mthreads --thread-safe pthread-config pthreads pthread" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # none will prepended at OS modifications below # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) # -pthreads: Solaris/gcc # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads too; # also defines -D_REENTRANT) # ... -mt is also the pthreads flag for HP/aCC # -mthreads: Mingw32/gcc, Lynx/gcc # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) # pthread: Linux, etcetera # pthreads: AIX (very old gcc's on AIX must check this before -lpthread, # handled below) # In general, linking only is moved at the end of all tests case "${host_cpu}-${host_os}" in *solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (We need to link with -pthreads/-mt/ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather # a function called by this macro, so we could check for that, but # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: ax_pthread_flags="-mt -pthread $ax_pthread_flags" if test x"$GCC" = xyes; then ax_pthread_flags="-pthreads pthread -pthread $ax_pthread_flags" fi ;; *hp-ux*) # On HP-UX compiling with aCC, cc understands -mthreads as '-mt' # '-hreads' ..., the test succeeds but it fails to run. # '-mt' must be checked first if test x"$GCC" != xyes; then ax_pthread_flags="-mt $ax_pthread_flags" fi ;; *-darwin*) ax_pthread_flags="-pthread $ax_pthread_flags" ;; *-aix*) # On AIX (at least, for some gcc-versions), -lpthreads works for C # only, so link-based tests will erroneously succeed from C++ point # of view. (We need to link with -pthread to use the right runtime # libraries.) But there're old gcc versions known to fail for this # ... so, we'll just look for -lpthreads first for them: ax_pthread_flags="-pthread pthreads $ax_pthread_flags" ;; esac case "${host_cpu}-${host_os}" in *solaris*) ;; *) ax_pthread_flags="none $ax_pthread_flags" ;; esac if test x"$ax_pthread_ok" = xno; then for flag in $ax_pthread_flags; do case $flag in none) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 $as_echo_n "checking whether pthreads work without any flags... " >&6; } ;; -*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5 $as_echo_n "checking whether pthreads work with $flag... " >&6; } PTHREAD_CFLAGS="$flag" ;; pthread-config) # Extract the first word of "pthread-config", so it can be a program name with args. set dummy pthread-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ax_pthread_config+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ax_pthread_config"; then ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ax_pthread_config="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" fi fi ax_pthread_config=$ac_cv_prog_ax_pthread_config if test -n "$ax_pthread_config"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 $as_echo "$ax_pthread_config" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x"$ax_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5 $as_echo_n "checking for the pthreads library -l$flag... " >&6; } PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include static void routine(void *a) { a = 0; } static void *start_routine(void *a) { return a; } int main () { pthread_t th; pthread_attr_t attr; pthread_create(&th, 0, start_routine, 0); pthread_join(th, 0); pthread_attr_init(&attr); pthread_cleanup_push(routine, 0); pthread_cleanup_pop(0) /* ; */ ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ax_pthread_ok=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 $as_echo "$ax_pthread_ok" >&6; } if test "x$ax_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Various other checks: if test "x$ax_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 $as_echo_n "checking for joinable pthread attribute... " >&6; } attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { int attr = $attr; return attr /* ; */ ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : attr_name=$attr; break fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5 $as_echo "$attr_name" >&6; } if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then cat >>confdefs.h <<_ACEOF #define PTHREAD_CREATE_JOINABLE $attr_name _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5 $as_echo_n "checking if more special flags are required for pthreads... " >&6; } flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5 $as_echo "${flag}" >&6; } if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: must compile with xlc_r or cc_r if test x"$GCC" != xyes; then for ac_prog in xlc_r cc_r do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PTHREAD_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PTHREAD_CC"; then ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PTHREAD_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PTHREAD_CC=$ac_cv_prog_PTHREAD_CC if test -n "$PTHREAD_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 $as_echo "$PTHREAD_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PTHREAD_CC" && break done test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}" for ac_prog in xlC_r CC_r do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PTHREAD_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PTHREAD_CXX"; then ac_cv_prog_PTHREAD_CXX="$PTHREAD_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PTHREAD_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PTHREAD_CXX=$ac_cv_prog_PTHREAD_CXX if test -n "$PTHREAD_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CXX" >&5 $as_echo "$PTHREAD_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PTHREAD_CXX" && break done test -n "$PTHREAD_CXX" || PTHREAD_CXX="${CXX}" else PTHREAD_CC="$CC" PTHREAD_CXX="$CXX" fi else PTHREAD_CC="$CC" PTHREAD_CXX="$CXX" fi # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$ax_pthread_ok" = xyes; then $as_echo "#define ENABLE_THREADS 1" >>confdefs.h $as_echo "#define HAVE_PTHREAD 1" >>confdefs.h CC="$PTHREAD_CC" CXX="$PTHREAD_CXX" if test -n "$PTHREAD_LIBS"; then : LINKFLAGS="$LINKFLAGS $PTHREAD_LIBS" fi if test -n "$PTHREAD_CFLAGS"; then : CFLAGS="$CFLAGS $PTHREAD_CFLAGS" fi for ac_header in pthread.h do : ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" if test "x$ac_cv_header_pthread_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTHREAD_H 1 _ACEOF fi done if test "x$ac_cv_func_strerror_r" != "xyes" -a "x$ac_cv_threadsafe_strerror" != "xyes"; then : as_fn_error $? "strerror_r or thread safe strerror required" "$LINENO" 5 fi if true; then ENABLE_THREADS_TRUE= ENABLE_THREADS_FALSE='#' else ENABLE_THREADS_TRUE='#' ENABLE_THREADS_FALSE= fi WITH_THREADS_CONFIGURED=1 # Braces checks derived from here: # http://git.savannah.gnu.org/gitweb/?p=guile.git;a=blob_plain;f=configure.ac;hb=HEAD old_CFLAGS="$CFLAGS" if test "$GCC" = "yes"; then # Since GCC only issues a warning for missing braces, so we need # `-Werror' to catch it. CFLAGS="-Werror -Wmissing-braces $CFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether PTHREAD_ONCE_INIT needs braces" >&5 $as_echo_n "checking whether PTHREAD_ONCE_INIT needs braces... " >&6; } if ${mp_cv_need_braces_on_pthread_once_init+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include pthread_once_t foo = PTHREAD_ONCE_INIT; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : mp_cv_need_braces_on_pthread_once_init=no else mp_cv_need_braces_on_pthread_once_init=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mp_cv_need_braces_on_pthread_once_init" >&5 $as_echo "$mp_cv_need_braces_on_pthread_once_init" >&6; } if test "$mp_cv_need_braces_on_pthread_once_init" = yes; then $as_echo "#define NEED_PTHREAD_ONCE_INIT_BRACES 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether PTHREAD_MUTEX_INITIALIZER needs braces" >&5 $as_echo_n "checking whether PTHREAD_MUTEX_INITIALIZER needs braces... " >&6; } if ${mp_cv_need_braces_on_pthread_mutex_initializer+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include pthread_mutex_t foo = PTHREAD_MUTEX_INITIALIZER; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : mp_cv_need_braces_on_pthread_mutex_initializer=no else mp_cv_need_braces_on_pthread_mutex_initializer=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mp_cv_need_braces_on_pthread_mutex_initializer" >&5 $as_echo "$mp_cv_need_braces_on_pthread_mutex_initializer" >&6; } if test "$mp_cv_need_braces_on_pthread_mutex_initializer" = yes; then $as_echo "#define NEED_PTHREAD_MUTEX_INITIALIZER_BRACES 1" >>confdefs.h fi CFLAGS="$old_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sem_init" >&5 $as_echo_n "checking for library containing sem_init... " >&6; } if ${ac_cv_search_sem_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sem_init (); int main () { return sem_init (); ; return 0; } _ACEOF for ac_lib in '' rt; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_sem_init=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_sem_init+:} false; then : break fi done if ${ac_cv_search_sem_init+:} false; then : else ac_cv_search_sem_init=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sem_init" >&5 $as_echo "$ac_cv_search_sem_init" >&6; } ac_res=$ac_cv_search_sem_init if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi : else ax_pthread_ok=no if test "x${ENABLE_THREADS}" = "xyes"; then : as_fn_error $? "No suitable threading library found" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: No suitable threading library found - disable TLS support" >&5 $as_echo "$as_me: No suitable threading library found - disable TLS support" >&6;} fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi # endif : --enable-threads if false; then WITH_LIBLOG4CPLUS_TRUE= WITH_LIBLOG4CPLUS_FALSE='#' else WITH_LIBLOG4CPLUS_TRUE='#' WITH_LIBLOG4CPLUS_FALSE= fi if false; then WITH_FULL_CONSOLE_LOGGER_TRUE= WITH_FULL_CONSOLE_LOGGER_FALSE='#' else WITH_FULL_CONSOLE_LOGGER_TRUE='#' WITH_FULL_CONSOLE_LOGGER_FALSE= fi WITH_LIBLOG4CPLUS=0 # Check whether --enable-logging was given. if test "${enable_logging+set}" = set; then : enableval=$enable_logging; ENABLE_LOGGING="$enableval" else ENABLE_LOGGING="check" fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi case "$host" in #( *-[Hh][Pp][Uu][Xx]*) : ax_linkext_default_shared=".sl"; ax_linkext_default_archive=".a"; ax_linkext_default_objext="$OBJEXT" ;; #( *-[Dd][Aa][Rr][Ww][Ii][Nn]*) : ax_linkext_default_shared=".dylib"; ax_linkext_default_archive=".a"; ax_linkext_default_objext="$OBJEXT" ;; #( *) : ax_linkext_default_shared=".so"; ax_linkext_default_archive=".a"; ax_linkext_default_objext="$OBJEXT" ;; esac ax_default_linkexts="$ax_linkext_default_shared:$ax_linkext_default_archive:$ax_linkext_default_objext" if test "x$ENABLE_LOGGING" != "xno"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if liblog4cplus is wanted" >&5 $as_echo_n "checking if liblog4cplus is wanted... " >&6; } if ${ax_cv_with_liblog4cplus+:} false; then : $as_echo_n "(cached) " >&6 else ax_with_liblog4cplus_default="check" # Check whether --with-log4cplus was given. if test "${with_log4cplus+set}" = set; then : withval=$with_log4cplus; ax_with_liblog4cplus="${withval}" else ax_with_liblog4cplus="${ax_with_liblog4cplus_default}" fi ax_cv_with_liblog4cplus="${ax_with_liblog4cplus}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_with_liblog4cplus" >&5 $as_echo "$ax_cv_with_liblog4cplus" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if liblog4cplus wants a prefix" >&5 $as_echo_n "checking if liblog4cplus wants a prefix... " >&6; } if ${ax_cv_with_liblog4cplus_prefix+:} false; then : $as_echo_n "(cached) " >&6 else if test "x${ax_with_liblog4cplus}" != "xno"; then : # Check whether --with-liblog4cplus-prefix was given. if test "${with_liblog4cplus_prefix+set}" = set; then : withval=$with_liblog4cplus_prefix; ax_with_liblog4cplus_prefix="`echo ${withval} | ${SED} -e 's|/*$||'`" else ax_with_liblog4cplus_prefix="" fi else ax_with_liblog4cplus_prefix="" fi if test "x${ax_with_liblog4cplus_prefix}" != "x"; then : ax_cv_with_liblog4cplus_prefix="${ax_with_liblog4cplus_prefix}" else ax_cv_with_liblog4cplus_prefix="no" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_with_liblog4cplus_prefix" >&5 $as_echo "$ax_cv_with_liblog4cplus_prefix" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if liblog4cplus is wanted" >&5 $as_echo_n "checking if liblog4cplus is wanted... " >&6; } if ${ax_cv_with_liblog4cplus+:} false; then : $as_echo_n "(cached) " >&6 else ax_with_liblog4cplus_default="check" # Check whether --with-log4cplus was given. if test "${with_log4cplus+set}" = set; then : withval=$with_log4cplus; ax_with_liblog4cplus="${withval}" else ax_with_liblog4cplus="${ax_with_liblog4cplus_default}" fi ax_cv_with_liblog4cplus="${ax_with_liblog4cplus}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_with_liblog4cplus" >&5 $as_echo "$ax_cv_with_liblog4cplus" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if liblog4cplus wants a prefix" >&5 $as_echo_n "checking if liblog4cplus wants a prefix... " >&6; } if ${ax_cv_with_liblog4cplus_prefix+:} false; then : $as_echo_n "(cached) " >&6 else if test "x${ax_with_liblog4cplus}" != "xno"; then : # Check whether --with-liblog4cplus-prefix was given. if test "${with_liblog4cplus_prefix+set}" = set; then : withval=$with_liblog4cplus_prefix; ax_with_liblog4cplus_prefix="`echo ${withval} | ${SED} -e 's|/*$||'`" else ax_with_liblog4cplus_prefix="" fi else ax_with_liblog4cplus_prefix="" fi if test "x${ax_with_liblog4cplus_prefix}" != "x"; then : ax_cv_with_liblog4cplus_prefix="${ax_with_liblog4cplus_prefix}" else ax_cv_with_liblog4cplus_prefix="no" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_with_liblog4cplus_prefix" >&5 $as_echo "$ax_cv_with_liblog4cplus_prefix" >&6; } if test "x${ax_with_liblog4cplus}" != "xno"; then : if ${ax_cv_found_liblog4cplus+:} false; then : else if test "x${log4cplus_CFLAGS}" = "x" -a "x${log4cplus_LIBS}" = "x"; then : ax_safe_cppflags="${CPPFLAGS}" ax_safe_libs="${LIBS}" ax_safe_pkg_config_path="${PKG_CONFIG_PATH}" PKG_CONFIG_PATH="" ax_pkg_config_path_sep="" for dir in ${ax_with_liblog4cplus_prefix} ${acl_final_exec_prefix} ${acl_final_prefix} ${PRODUKTDIR} /usr/pkg /opt/freeware /usr/local /usr; do if test -d "${dir}/lib/pkgconfig" -a -z "`$as_echo $PKG_CONFIG_PATH | $GREP ${dir}/lib/pkgconfig`"; then : PKG_CONFIG_PATH="${PKG_CONFIG_PATH}${ax_pkg_config_path_sep}${dir}/lib/pkgconfig" ax_pkg_config_path_sep=$PATH_SEPARATOR fi done if test -n "${ax_safe_pkg_config_path}"; then : PKG_CONFIG_PATH="${PKG_CONFIG_PATH}${ax_pkg_config_path_sep}${ax_safe_pkg_config_path}" fi export PKG_CONFIG_PATH pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for log4cplus" >&5 $as_echo_n "checking for log4cplus... " >&6; } if test -n "$log4cplus_CFLAGS"; then pkg_cv_log4cplus_CFLAGS="$log4cplus_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"log4cplus >= 1.0.5\""; } >&5 ($PKG_CONFIG --exists --print-errors "log4cplus >= 1.0.5") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_log4cplus_CFLAGS=`$PKG_CONFIG --cflags "log4cplus >= 1.0.5" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$log4cplus_LIBS"; then pkg_cv_log4cplus_LIBS="$log4cplus_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"log4cplus >= 1.0.5\""; } >&5 ($PKG_CONFIG --exists --print-errors "log4cplus >= 1.0.5") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_log4cplus_LIBS=`$PKG_CONFIG --libs "log4cplus >= 1.0.5" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then log4cplus_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "log4cplus >= 1.0.5" 2>&1` else log4cplus_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "log4cplus >= 1.0.5" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$log4cplus_PKG_ERRORS" >&5 found_log4cplus_lib= elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } found_log4cplus_lib= else log4cplus_CFLAGS=$pkg_cv_log4cplus_CFLAGS log4cplus_LIBS=$pkg_cv_log4cplus_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } for element in ${log4cplus_CFLAGS}; do ax_var_contains_found= for x in $CPPFLAGS; do if test "X$x" = "X$element"; then : ax_var_contains_found=yes break fi done if test -n "$ax_var_contains_found"; then : else CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done for element in ${log4cplus_LIBS}; do ax_var_contains_found= for x in $LIBS; do if test "X$x" = "X$element"; then : ax_var_contains_found=yes break fi done if test -n "$ax_var_contains_found"; then : else LIBS="${LIBS}${LIBS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking if liblog4cplus can be linked with flags from pkg-config" >&5 $as_echo_n "checking if liblog4cplus can be linked with flags from pkg-config... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include int main () { log4cplus_basic_configure(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } found_log4cplus="yes" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="${ax_safe_libs}" ax_save_Name_LIBS="${log4cplus_LIBS}" if test "x${found_log4cplus}" != "xyes"; then : log4cplus_LIBS="${ax_save_Name_LIBS} -lstdc++" for element in ${log4cplus_LIBS}; do ax_var_contains_found= for x in $LIBS; do if test "X$x" = "X$element"; then : ax_var_contains_found=yes break fi done if test -n "$ax_var_contains_found"; then : else LIBS="${LIBS}${LIBS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking if liblog4cplus can be linked with flags from pkg-config and \"-lstdc++\"" >&5 $as_echo_n "checking if liblog4cplus can be linked with flags from pkg-config and \"-lstdc++\"... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include int main () { log4cplus_basic_configure(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } found_log4cplus="yes" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="${ax_safe_libs}" fi if test "x${found_log4cplus}" != "xyes"; then : log4cplus_LIBS="${ax_save_Name_LIBS} -lstdc++ -lunwind" for element in ${log4cplus_LIBS}; do ax_var_contains_found= for x in $LIBS; do if test "X$x" = "X$element"; then : ax_var_contains_found=yes break fi done if test -n "$ax_var_contains_found"; then : else LIBS="${LIBS}${LIBS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking if liblog4cplus can be linked with flags from pkg-config and \"-lstdc++ -lunwind\"" >&5 $as_echo_n "checking if liblog4cplus can be linked with flags from pkg-config and \"-lstdc++ -lunwind\"... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include int main () { log4cplus_basic_configure(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } found_log4cplus="yes" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="${ax_safe_libs}" fi fi PKG_CONFIG_PATH="${ax_safe_pkg_config_path}" ax_search_lib_path_checked=":" if test "x_$found_log4cplus" != "x_yes"; then : for dir in ${ax_with_liblog4cplus_prefix} ${acl_final_exec_prefix} ${acl_final_prefix} ${PRODUKTDIR} /usr/pkg /opt/freeware /usr/local /usr; do if test -d "${dir}" -a -z "`$as_echo $ax_search_lib_path_checked | $GREP :${dir}:`"; then : ax_search_lib_path_checked="${ax_search_lib_path_checked}${dir}:" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if liblog4cplus is in $dir" >&5 $as_echo_n "checking if liblog4cplus is in $dir... " >&6; } found_log4cplus_include= if test -f "$dir/include/log4cplus/clogger.h"; then found_log4cplus_include="yes"; fi found_log4cplus_lib= if test -f "$dir/lib/liblog4cplus$ax_linkext_default_shared"; then found_log4cplus_lib="yes"; elif test -f "$dir/lib/liblog4cplus$ax_linkext_default_archive"; then found_log4cplus_lib="yes"; elif test -f "$dir/lib/log4cplus$ax_linkext_default_objext"; then found_log4cplus_lib="yes"; fi if test "x${found_log4cplus_include}" != "x" -a "x${found_log4cplus_lib}" != "x"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } log4cplus_CFLAGS="-I$dir/include" for element in ${log4cplus_CFLAGS}; do ax_var_contains_found= for x in $CPPFLAGS; do if test "X$x" = "X$element"; then : ax_var_contains_found=yes break fi done if test -n "$ax_var_contains_found"; then : else CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done log4cplus_LIBS="-L$dir/lib -llog4cplus" for element in ${log4cplus_LIBS}; do ax_var_contains_found= for x in $LIBS; do if test "X$x" = "X$element"; then : ax_var_contains_found=yes break fi done if test -n "$ax_var_contains_found"; then : else LIBS="${LIBS}${LIBS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking if liblog4cplus can be linked alone" >&5 $as_echo_n "checking if liblog4cplus can be linked alone... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include int main () { log4cplus_basic_configure(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } found_log4cplus="yes" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="${ax_safe_libs}" if test "x${found_log4cplus}" = "xyes"; then : break fi log4cplus_LIBS="-L$dir/lib -llog4cplus -lstdc++" for element in ${log4cplus_LIBS}; do ax_var_contains_found= for x in $LIBS; do if test "X$x" = "X$element"; then : ax_var_contains_found=yes break fi done if test -n "$ax_var_contains_found"; then : else LIBS="${LIBS}${LIBS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking if liblog4cplus can be linked with -lstdc++" >&5 $as_echo_n "checking if liblog4cplus can be linked with -lstdc++... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include int main () { log4cplus_basic_configure(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } found_log4cplus="yes" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="${ax_safe_libs}" if test "x${found_log4cplus}" = "xyes"; then : break fi log4cplus_LIBS="-L$dir/lib -llog4cplus -lstdc++ -lunwind" for element in ${log4cplus_LIBS}; do ax_var_contains_found= for x in $LIBS; do if test "X$x" = "X$element"; then : ax_var_contains_found=yes break fi done if test -n "$ax_var_contains_found"; then : else LIBS="${LIBS}${LIBS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking if liblog4cplus can be linked with -lstdc++ -lunwind" >&5 $as_echo_n "checking if liblog4cplus can be linked with -lstdc++ -lunwind... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include int main () { log4cplus_basic_configure(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } found_log4cplus="yes" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="${ax_safe_libs}" if test "x${found_log4cplus}" = "xyes"; then : break fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x${found_log4cplus}" = "xyes"; then : break fi CPPFLAGS="${ax_safe_cppflags}" fi done fi CPPFLAGS="${ax_safe_cppflags}" LIBS="${ax_safe_libs}" ax_cv_found_liblog4cplus="${found_log4cplus}" else found_log4cplus="yes" ax_cv_found_liblog4cplus="${found_log4cplus}" fi fi if test "x_$found_log4cplus" != "x_yes"; then : if test "x${ax_with_liblog4cplus}" = "xyes"; then : as_fn_error $? "Cannot find suitable liblog4cplus library" "$LINENO" 5 fi else if test -n "${log4cplus_CFLAGS}"; then : INC_LOG4CPLUS="" INC_LOG4CPLUS_SEP="" for incpm in ${log4cplus_CFLAGS} do INC_LOG4CPLUS="${INC_LOG4CPLUS}${INC_LOG4CPLUS_SEP}${incpm}" INC_LOG4CPLUS_SEP=" " done fi LIBS_LOG4CPLUS="" LIBS_LOG4CPLUS_SEP="" for libpm in ${log4cplus_LIBS} do LIBS_LOG4CPLUS="${LIBS_LOG4CPLUS}${LIBS_LOG4CPLUS_SEP}${libpm}" LIBS_LOG4CPLUS_SEP=" " done HAVE_LIBLOG4CPLUS=yes if true; then WITH_LIBLOG4CPLUS_TRUE= WITH_LIBLOG4CPLUS_FALSE='#' else WITH_LIBLOG4CPLUS_TRUE='#' WITH_LIBLOG4CPLUS_FALSE= fi WITH_LIBLOG4CPLUS=1 for element in ${LIBS_LOG4CPLUS}; do ax_var_contains_found= for x in $LINKFLAGS; do if test "X$x" = "X$element"; then : ax_var_contains_found=yes break fi done if test -n "$ax_var_contains_found"; then : else LINKFLAGS="${LINKFLAGS}${LINKFLAGS:+ }$element" fi done for element in ${INC_LOG4CPLUS}; do ax_var_contains_found= for x in $CLIBFLAGS; do if test "X$x" = "X$element"; then : ax_var_contains_found=yes break fi done if test -n "$ax_var_contains_found"; then : else CLIBFLAGS="${CLIBFLAGS}${CLIBFLAGS:+ }$element" fi done $as_echo "#define WITH_LIBLOG4CPLUS 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: compiling in support for liblog4cplus (LIBS=\"$LIBS_LOG4CPLUS}\")" >&5 $as_echo "$as_me: compiling in support for liblog4cplus (LIBS=\"$LIBS_LOG4CPLUS}\")" >&6;} fi else HAVE_LIBLOG4CPLUS= fi if test "x$WITH_LIBLOG4CPLUS" = "x1"; then : ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking if liblog4cplus is built with thread support" >&5 $as_echo_n "checking if liblog4cplus is built with thread support... " >&6; } ax_cppflags_safe="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $CLIBFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include #if defined(LOG4CPLUS_SINGLE_THREADED) #error no threads #endif int main() { return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ax_liblog4cplus_threads=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ax_liblog4cplus_threads=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="$ax_cppflags_safe" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi if test "x$ENABLE_LOGGING" = "xyes" -a "x$WITH_LIBLOG4CPLUS" != "x1"; then : if false; then WITH_FULL_CONSOLE_LOGGER_TRUE= WITH_FULL_CONSOLE_LOGGER_FALSE='#' else WITH_FULL_CONSOLE_LOGGER_TRUE='#' WITH_FULL_CONSOLE_LOGGER_FALSE= fi $as_echo "#define WITH_FULL_CONSOLE_LOGGER 1" >>confdefs.h WITH_FULL_CONSOLE_LOGGER="1" fi fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf # Set options enable_dlopen=no enable_win32_dll=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_commands="$ac_config_commands libtool" # Only expand once: # The LIBS and CPPFLAGS that saidar needs # The flags needed to link to libstatgrab # (ie. our dependencies) # Ownership and permissions possibly needed for binaries # And finish by changing these files ac_config_files="$ac_config_files Makefile src/Makefile src/libstatgrab/Makefile src/statgrab/Makefile src/saidar/Makefile docs/Makefile docs/libstatgrab/Makefile docs/statgrab/Makefile docs/saidar/Makefile tests/Makefile tests/testlib/Makefile tests/single_threaded/Makefile tests/multi_threaded/Makefile examples/Makefile libstatgrab.pc src/statgrab/statgrab-make-mrtg-config src/statgrab/statgrab-make-mrtg-index" ac_config_files="$ac_config_files src/libstatgrab/statgrab.h" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SETGIDBINS_TRUE}" && test -z "${SETGIDBINS_FALSE}"; then as_fn_error $? "conditional \"SETGIDBINS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SETUIDBINS_TRUE}" && test -z "${SETUIDBINS_FALSE}"; then as_fn_error $? "conditional \"SETUIDBINS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MINGW_TRUE}" && test -z "${MINGW_FALSE}"; then as_fn_error $? "conditional \"MINGW\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SETUIDBINS_TRUE}" && test -z "${SETUIDBINS_FALSE}"; then as_fn_error $? "conditional \"SETUIDBINS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SETUIDBINS_TRUE}" && test -z "${SETUIDBINS_FALSE}"; then as_fn_error $? "conditional \"SETUIDBINS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MINGW_TRUE}" && test -z "${MINGW_FALSE}"; then as_fn_error $? "conditional \"MINGW\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STATGRAB_TRUE}" && test -z "${STATGRAB_FALSE}"; then as_fn_error $? "conditional \"STATGRAB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STATGRAB_TRUE}" && test -z "${STATGRAB_FALSE}"; then as_fn_error $? "conditional \"STATGRAB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SAIDAR_TRUE}" && test -z "${SAIDAR_FALSE}"; then as_fn_error $? "conditional \"SAIDAR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SAIDAR_TRUE}" && test -z "${SAIDAR_FALSE}"; then as_fn_error $? "conditional \"SAIDAR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SAIDAR_TRUE}" && test -z "${SAIDAR_FALSE}"; then as_fn_error $? "conditional \"SAIDAR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${EXAMPLES_TRUE}" && test -z "${EXAMPLES_FALSE}"; then as_fn_error $? "conditional \"EXAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${EXAMPLES_TRUE}" && test -z "${EXAMPLES_FALSE}"; then as_fn_error $? "conditional \"EXAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_MANPAGES_TRUE}" && test -z "${BUILD_MANPAGES_FALSE}"; then as_fn_error $? "conditional \"BUILD_MANPAGES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_MANPAGES_TRUE}" && test -z "${BUILD_MANPAGES_FALSE}"; then as_fn_error $? "conditional \"BUILD_MANPAGES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_MANPAGES_TRUE}" && test -z "${BUILD_MANPAGES_FALSE}"; then as_fn_error $? "conditional \"BUILD_MANPAGES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${TESTS_TRUE}" && test -z "${TESTS_FALSE}"; then as_fn_error $? "conditional \"TESTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${TEST_SCRIPTS_TRUE}" && test -z "${TEST_SCRIPTS_FALSE}"; then as_fn_error $? "conditional \"TEST_SCRIPTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${TESTS_TRUE}" && test -z "${TESTS_FALSE}"; then as_fn_error $? "conditional \"TESTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${TEST_SCRIPTS_TRUE}" && test -z "${TEST_SCRIPTS_FALSE}"; then as_fn_error $? "conditional \"TEST_SCRIPTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SETGIDBINS_TRUE}" && test -z "${SETGIDBINS_FALSE}"; then as_fn_error $? "conditional \"SETGIDBINS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SETGIDBINS_TRUE}" && test -z "${SETGIDBINS_FALSE}"; then as_fn_error $? "conditional \"SETGIDBINS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SETUIDBINS_TRUE}" && test -z "${SETUIDBINS_FALSE}"; then as_fn_error $? "conditional \"SETUIDBINS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SETUIDBINS_TRUE}" && test -z "${SETUIDBINS_FALSE}"; then as_fn_error $? "conditional \"SETUIDBINS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_THREADS_TRUE}" && test -z "${ENABLE_THREADS_FALSE}"; then as_fn_error $? "conditional \"ENABLE_THREADS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_THREADS_TRUE}" && test -z "${ENABLE_THREADS_FALSE}"; then as_fn_error $? "conditional \"ENABLE_THREADS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_THREADS_TRUE}" && test -z "${ENABLE_THREADS_FALSE}"; then as_fn_error $? "conditional \"ENABLE_THREADS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_LIBLOG4CPLUS_TRUE}" && test -z "${WITH_LIBLOG4CPLUS_FALSE}"; then as_fn_error $? "conditional \"WITH_LIBLOG4CPLUS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_FULL_CONSOLE_LOGGER_TRUE}" && test -z "${WITH_FULL_CONSOLE_LOGGER_FALSE}"; then as_fn_error $? "conditional \"WITH_FULL_CONSOLE_LOGGER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_LIBLOG4CPLUS_TRUE}" && test -z "${WITH_LIBLOG4CPLUS_FALSE}"; then as_fn_error $? "conditional \"WITH_LIBLOG4CPLUS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_FULL_CONSOLE_LOGGER_TRUE}" && test -z "${WITH_FULL_CONSOLE_LOGGER_FALSE}"; then as_fn_error $? "conditional \"WITH_FULL_CONSOLE_LOGGER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by libstatgrab $as_me 0.90, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to . libstatgrab home page: ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ libstatgrab config.status 0.90 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SED \ GREP \ EGREP \ FGREP \ SHELL \ ECHO \ LD \ PATH_SEPARATOR \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/libstatgrab/Makefile") CONFIG_FILES="$CONFIG_FILES src/libstatgrab/Makefile" ;; "src/statgrab/Makefile") CONFIG_FILES="$CONFIG_FILES src/statgrab/Makefile" ;; "src/saidar/Makefile") CONFIG_FILES="$CONFIG_FILES src/saidar/Makefile" ;; "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;; "docs/libstatgrab/Makefile") CONFIG_FILES="$CONFIG_FILES docs/libstatgrab/Makefile" ;; "docs/statgrab/Makefile") CONFIG_FILES="$CONFIG_FILES docs/statgrab/Makefile" ;; "docs/saidar/Makefile") CONFIG_FILES="$CONFIG_FILES docs/saidar/Makefile" ;; "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; "tests/testlib/Makefile") CONFIG_FILES="$CONFIG_FILES tests/testlib/Makefile" ;; "tests/single_threaded/Makefile") CONFIG_FILES="$CONFIG_FILES tests/single_threaded/Makefile" ;; "tests/multi_threaded/Makefile") CONFIG_FILES="$CONFIG_FILES tests/multi_threaded/Makefile" ;; "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; "libstatgrab.pc") CONFIG_FILES="$CONFIG_FILES libstatgrab.pc" ;; "src/statgrab/statgrab-make-mrtg-config") CONFIG_FILES="$CONFIG_FILES src/statgrab/statgrab-make-mrtg-config" ;; "src/statgrab/statgrab-make-mrtg-index") CONFIG_FILES="$CONFIG_FILES src/statgrab/statgrab-make-mrtg-index" ;; "src/libstatgrab/statgrab.h") CONFIG_FILES="$CONFIG_FILES src/libstatgrab/statgrab.h" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX " # ### BEGIN LIBTOOL CONFIG # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi libstatgrab-0.90/docs/000755 001750 001750 00000000000 12200045620 014633 5ustar00tdbusers000000 000000 libstatgrab-0.90/INSTALL000444 001750 001750 00000036605 12200045540 014745 0ustar00tdbusers000000 000000 Installation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2012 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" 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 prerequisites, which makes it generally unusable when shipped generated files such as `configure' are involved. Use GNU `make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf limitation. Until the limitation is lifted, you can use this workaround: CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. libstatgrab-0.90/ar-lib000555 001750 001750 00000013302 12200045540 014775 0ustar00tdbusers000000 000000 #! /bin/sh # Wrapper for Microsoft lib.exe me=ar-lib scriptversion=2012-03-01.08; # UTC # Copyright (C) 2010-2012 Free Software Foundation, Inc. # Written by Peter Rosin . # # 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 . # 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 or send patches to # . # func_error message func_error () { echo "$me: $1" 1>&2 exit 1 } file_conv= # func_file_conv build_file # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. 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*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv in mingw) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin) file=`cygpath -m "$file" || echo "$file"` ;; wine) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_at_file at_file operation archive # Iterate over all members in AT_FILE performing OPERATION on ARCHIVE # for each of them. # When interpreting the content of the @FILE, do NOT use func_file_conv, # since the user would need to supply preconverted file names to # binutils ar, at least for MinGW. func_at_file () { operation=$2 archive=$3 at_file_contents=`cat "$1"` eval set x "$at_file_contents" shift for member do $AR -NOLOGO $operation:"$member" "$archive" || exit $? done } case $1 in '') func_error "no command. Try '$0 --help' for more information." ;; -h | --h*) cat < Fix vector creation for 1 element vectors. Hash: beb0e2be3fb9994d90194b032b96e218b73be463 Files affected: src/libstatgrab/cpu_stats.c src/libstatgrab/globals.h 2013-08-03 Jens Rehsack Skip CTL_HW.HW_MACHINE_ARCH error in some cases. Be quiet when CTL_HW.HW_MACHINE_ARCH fails, but CTL_HW.HW_MACHINE works. Hash: 7880116baf3f6590b33137ff8a4d3f257825479c Files affected: src/libstatgrab/os_info.c 2013-08-02 Tim Bishop Update version number for final release. Hash: da0893f656c19ad35f3bd9fcabd4dd0e621a1ced Files affected: configure.ac 2013-08-02 Tim Bishop Update the README, NEWS and PLATFORMS files. Remove $Id$, since it's no longer expanded. Hash: 5f01fdde1b381ac82bd00a06978d1a116ec9b696 Files affected: NEWS PLATFORMS README README.CVS README.git 2013-08-02 Jens Rehsack Update NEWS - prepare for sync with tdb@. Hash: 456d2defee7c0d9157298f3ac83272bb3ce03b08 Files affected: NEWS 2013-07-31 Tim Bishop Final RC build, libstatgrab-0.90-rc4. Hash: d56179a5d028255f0ee8042ec49bfe3c3c38bc15 Files affected: TESTING configure.ac 2013-07-31 Tim Bishop Fix Solaris check. Solaris is known as solaris2.N not solarisN. Need two sets of brackets. Hash: a55788694a91bc92e022a0bd12aacc179fb46d1f Files affected: configure.ac 2013-07-31 Jens Rehsack Introduce ability to skip def printf/scanf fmt. Hash: ed7ff9df7fa2bd15a652672dc6f084417f8142ed Files affected: configure.ac m4/ax_types.m4 2013-07-31 Jens Rehsack Refactor AX_APPEND_TO_VAR. * Extract "function" macro: AX_VAR_CONTAINS_IF_ELSE from AX_APPEND_TO_VAR. * Introduce macro AX_VAR_CONTAINS_ANY_IF_ELSE analogue to AX_VAR_CONTAINS_IF_ELSE. Hash: afa36180d224131589be872d8096d9b7ca2fab93 Files affected: m4/ax_shellvars.m4 2013-07-30 Jens Rehsack Correct some minor nits. Hash: 3c8f958231ea306de3b6530bec2350df109ebfd8 Files affected: src/libstatgrab/globals.c 2013-07-30 Jens Rehsack Improve / document type format checks. According to expected failed -Werror support in autoconf for non-gnu compilers, the format check was rewritten. Due touching it anyway, some tidying, documenting and polishing was done. Hash: d5a5984fe17999a894a6fac37448d880882c00fb Files affected: m4/ax_types.m4 2013-07-30 Jens Rehsack Similar to pid_t fmt check add some for [s]size_t. Hash: 97c50b2206ec9e2733e7db0c25a6f160404bda29 Files affected: configure.ac m4/ax_types.m4 src/libstatgrab/disk_stats.c src/libstatgrab/globals.c 2013-07-29 Jens Rehsack Remove unnecessary size_t usage to avoid crashes. Hash: 73ec085999d4bad294f7e20d739e9cdfd0bb348b Files affected: tests/multi_threaded/diff_stats.c tests/multi_threaded/full_stats.c 2013-07-29 Jens Rehsack process_stats fixes. * reduce message severity for passes away processes from ERROR to INFO. * clear mib structure before trying to fetch processes again. Hash: 5c882454746ccac63bd77ee3ef2afd8ef78ac6ee Files affected: src/libstatgrab/process_stats.c 2013-07-19 Tim Bishop Ready for rc3. Hash: ae7fafa946ca4716113ee2aae1be09c2a7782cd0 Files affected: TESTING configure.ac 2013-07-18 Reini Urban Error in tempfile() using template /tmp//... Use basename to strip a fullpath self->{exename} in the perl testlib. Hash: 640c76e6dcdb5902dff4b0c7b75eb92596df13fa Files affected: tests/testlib/run_tests.pm 2013-07-19 Jens Rehsack Fix finding of pkgsrc/mk/check-portability.awk: ERROR: [check-portability.awk] => Found test ... == ...: ERROR: [check-portability.awk] configure: if test "x$ac_cv_unspecified_size_last_struct_member" == "xyes"; then : ERROR: [check-portability.awk] configure: if test "x$ac_cv_zero_array_size" == "xyes"; then : Explanation: =========================================================================== The "test" command, as well as the "[" command, are not required to know the "==" operator. Only a few implementations like bash and some versions of ksh support it. Hash: 9bec82a23a3b3de6525b2e038716b7ee5ac218fe Files affected: configure.ac 2013-07-18 Tim Bishop Ready for 0.90-rc2. Hash: a08937a48ec352830cd31648b8fb870a524757c3 Files affected: TESTING configure.ac 2013-07-18 Jens Rehsack Don't add "." extension separator twice. Hash: ce057f680f67b6fcbdbc2643e4cc690d274f5389 Files affected: m4/ax_lib.m4 2013-07-18 Tim Bishop TODO has been moved to the GitHub issue tracker. https://github.com/i-scream/libstatgrab/issues Hash: 2e605d79b454ee61a46c1ece2e1d20e2c1bb88c1 Files affected: TODO 2013-07-17 Jens Rehsack Add libtool support to sg_log_init. sg_log_init will now remove trailing "/.libs" from dirname(argv[0]) when searching for properties file. That allows developers to forget about that .libs hidden subdir of libtool stuff. Hash: 9ff8d668b615429da5f3a0ef763aeb2f855d1eef Files affected: src/libstatgrab/tools.c 2013-07-17 Jens Rehsack Control log targets when log4cplus is used. For those environments with log4cplus support, the test controller now prepares special non-conflicting log-properties to guarantee proper test working. Further, in case of errors, the diagnostics improves. Hash: cd3afa5fb1e8f208e2800e3164b35139c8a36b62 Files affected: tests/testlib/run_tests.pm 2013-07-17 Jens Rehsack Add append mode for created log-files by default. Hash: de318e08d13b0c773f9d8fc998d579480a2801c4 Files affected: tests/multi_threaded/libstatgrab-test.properties tests/single_threaded/libstatgrab-test.properties 2013-07-17 Jens Rehsack Give more information about where we're running. Hash: 6ff05acbf6f0cd1ba4bac530c615fbaa7379cbd7 Files affected: tests/testlib/run_tests.pm 2013-07-17 Jens Rehsack Prefer __PACKAGE_->can() over accessing namespace. Hash: db2fd70e3e6c07329a39d7f4250b08b5b12de399 Files affected: tests/testlib/run_tests.pm 2013-07-17 Jens Rehsack Fix configure internal check regarding uvm/uvm.h. Hash: dcd18c633b17a3e88660e188eb0212b8ae9da7f6 Files affected: configure.ac 2013-07-16 Jens Rehsack Fix ugly typo. Hash: 0194d68ae99a873e8a54050639fdf5c44ae8ac53 Files affected: src/libstatgrab/process_stats.c 2013-07-16 Jens Rehsack Add support for compilers without unspec array len. There are compilers out there complaining about struct foo { char *bar; unsigned many[]; }; Provide tests and workarounds for hopefully all situations. Hash: 625fdce29d3d94fbe30e152582b37e670cbfbfb7 Files affected: configure.ac src/libstatgrab/process_stats.c 2013-07-16 Jens Rehsack Deal with old and/or broken ethtool.h. Hash: f340b3601de83e9bd9e5da392557c8f60a3faf29 Files affected: configure.ac src/libstatgrab/network_stats.c src/libstatgrab/tools.h 2013-07-16 Jens Rehsack Fix some ANSI C issues. Hash: 584cdbceb117adeb745d9524d2511e94a63b8837 Files affected: src/libstatgrab/globals.c src/statgrab/statgrab.c 2013-07-15 Jens Rehsack Don't +1 strlen too often. Hash: 0334609fcaee962433c43b47485da7a8ba67b671 Files affected: src/libstatgrab/tools.c src/libstatgrab/user_stats.c 2013-07-15 Jens Rehsack Use strnlen in sg_lupdate_string. If no strnlen is provided, use own one. Hash: a11142f588317cdc63b3135280f5c28b8ed4d793 Files affected: configure.ac src/libstatgrab/tools.c src/libstatgrab/tools.h 2013-07-15 Jens Rehsack Explain why only AC_CANONICAL_HOST. Explain (for dumb maintainers like me) why we only need AC_CANONICAL_HOST and why it's dumb to use --target. Hash: 37d0194fd48e655eeba9d1a2e333d7be2f9e983c Files affected: configure.ac 2013-07-15 Jens Rehsack Try to guess when a fixed sized buffer is used. When a fixed sized buffer is used in struct utmpx and/or struct utmp, use only the size of the source. Hash: 18233d3ec16539f648926970eb95830c89cc6e2b Files affected: src/libstatgrab/user_stats.c 2013-07-11 Tim Bishop For consistent behaviour add config.{guess,sub}. This makes it consistent across build platforms, and ensures that anyone checking out our Git repository gets the same versions of these files as we do. They match upstream so can be updated when needed. It'd be nice to be able to rely on the operating system provided ones being current, but at least in FreeBSD they're replaced by old ones. I consider that a bug, but it's not been resolved yet. They're sourced from here: http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD Hash: 6252f81d0ca56b18b3c9da30acbbe59875356d89 Files affected: .gitignore autogen.sh config.guess config.sub 2013-07-11 Tim Bishop Move the ChangeLog generation out of the Makefile. Having it in the Makefile broke the distcheck target. The specific failure case is if you do a VPATH configure, and then use the make dist target, it regenerates the ChangeLog file rather than using the one in $(srcdir) as it does for other distributed files. The reason it does this is because there's a ChangeLog target in the Makefile. This doesn't feel like a perfect solution, but it only makes life a little harder for devs, and fixes potential breakages for users. Hash: 426e76b4bbddf81a92308c2e4531687fa3bfbbc2 Files affected: Makefile.am autogen.sh 2013-07-11 Tim Bishop Only clean manpages with maintainer-clean. We don't distribute the source files for rebuilding these, so it makes no sense to clean them, or even distclean them. They're not intended to be rebuilt be users of the tarball, only by people working from the git sources. Hash: cb978e7f39f80b744a21b8448be5a81d8aa8de93 Files affected: docs/libstatgrab/Makefile.am docs/saidar/Makefile.am docs/statgrab/Makefile.am 2013-07-10 Tim Bishop Make check an alias for test. Ideally, the test suite would use the make check stuff properly, but this is sufficient to allow things like "make distcheck" to work. Hash: d21f938c9d257b774b7b2444e74c3a9d3c17f7be Files affected: Makefile.am 2013-07-10 Tim Bishop Only enable setuid/setgid binaries if requested. Prior to this commit, if required to collect statistics by the operating system, binaries were installed with the setuid or setgid bit set. Since the actual cases where this is needed are rare, and since it leaves a hole for exploitation, we now only do this if the user explicitly requests it when building. So setuid and setgid binaries are still available, you just need to use --enable-setuid-binaries or --enable-setgid-binaries to enable them. These options have no effect if the operating system has no need for setuid or setgid binaries to collect statistics. Hash: e571f4234036f8c8ca75be481b4179d03fee24fe Files affected: configure.ac 2013-07-04 Jens Rehsack Fix wrong item traced and rewrite func_name getter. Hash: 331c8eb7701b37f52d9d1ac50d14bc8d17b6297d Files affected: tests/testlib/routines.c 2013-07-04 Jens Rehsack Fix stack overflow. Fix stack overflow caused by not caring for: String input conversions store a null terminator ('\0') to mark the end of the input; the maximum field width does not include this terminator. Hash: 98c1fea6928ba8e3f61927ac51105fb4af150d99 Files affected: src/libstatgrab/process_stats.c 2013-07-04 Jens Rehsack Check buffer size before reading "char *". Check buffer size before reading "char *" to detect proc_cmdline quirks. Hash: 8e945de64604ef3e64f0c79100121473a68847a9 Files affected: src/libstatgrab/process_stats.c 2013-07-02 Tim Bishop Update TESTING notes. Hash: 275dfff412b8b32100271d32ca57b10a697ad32a Files affected: TESTING 2013-07-03 Jens Rehsack Fix format of size_t. Hash: 5d352e2b420be8bb68c7f72037aeed0d8ca6125c Files affected: src/libstatgrab/disk_stats.c 2013-07-02 Tim Bishop Add testing notes. Hash: d505c28bee1a7971ed971b8db99d3b7fa49e5761 Files affected: TESTING 2013-06-25 Tim Bishop Prepare for 0.90-rc1. Hash: 2fb2d45db9c1a3a22ef1e3c001b229cbab687090 Files affected: configure.ac 2013-06-25 Tim Bishop On Solaris don't prepend none to the flags. Hash: ce1cacbf63f4fdda3118597443930066e0b7477b Files affected: m4/ax_pthread.m4 2013-06-22 Jens Rehsack Central log initialization. Hash: c69cd38611f8990236e23f5a1ac382bf691162ac Files affected: configure.ac examples/cpu_usage.c examples/disk_traffic.c examples/filesys_snapshot.c examples/helpers.c examples/helpers.h examples/load_stats.c examples/network_iface_stats.c examples/network_traffic.c examples/os_info.c examples/page_stats.c examples/process_snapshot.c examples/process_stats.c examples/user_list.c examples/valid_filesystems.c examples/vm_stats.c saidar.properties src/libstatgrab/statgrab.h.in src/libstatgrab/tools.c src/saidar/saidar.c src/statgrab/statgrab.c tests/multi_threaded/diff_stats.c tests/multi_threaded/full_stats.c tests/single_threaded/diff_stats.c tests/single_threaded/full_stats.c tests/testlib/Makefile.am tests/testlib/log.c tests/testlib/testlib.h 2013-06-21 Tim Bishop Update TODO. Hash: a0cb1a02d690f27ae129a4d863f69f6479b679f8 Files affected: TODO 2013-06-21 Tim Bishop Update bug reporting locations. Hash: 40c4d2705257095a35946a8f927864fd031e0993 Files affected: README configure.ac 2013-06-21 Jens Rehsack Don't fail when a process dies. Don't fail when a process passes away while refining the process list fetched from kernel. Simply skip the process in such cases. Hash: 8c8e0e2d93506d6c201e12c701a0032698acf859 Files affected: src/libstatgrab/process_stats.c 2013-06-21 Jens Rehsack Improve error messaging on error during tests. Hash: 391cf512ef36e1e32bafb11ee17590f3bbd6de1d Files affected: tests/testlib/routines.c 2013-06-21 Jens Rehsack Whine one error. Hash: 8f9f37cadcc348793923544a3063083fe19f7a73 Files affected: tests/testlib/run_tests.pm 2013-06-20 Tim Bishop Document new sg_get_fs_stats_diff functions. Hash: 903d7a645e6d5e3fb222a2f24e142cec7a15c4ae Files affected: docs/libstatgrab/Makefile.am docs/libstatgrab/sg_get_fs_stats.xml 2013-06-20 Jens Rehsack Trace (note) func success for non-threaded tests. Trace (note) func success for single threaded tests too. This should help digging errors when something fails. Hash: 81458c7b6f1bc8f09213ffdac1e436b006139323 Files affected: tests/single_threaded/diff_stats.c tests/single_threaded/full_stats.c 2013-06-20 Jens Rehsack Format / attribute names fixed when logging is on. Hash: 298a32ff88f1857ded0fada83eccce9ad813bc8c Files affected: tests/multi_threaded/diff_stats.c tests/multi_threaded/full_stats.c tests/testlib/routines.c 2013-06-20 Jens Rehsack Introduce sg_get_fs_stats_diff. Hash: cdf23c809a67103d3964266e4626a04af6b19ade Files affected: src/libstatgrab/disk_stats.c src/libstatgrab/statgrab.h.in tests/testlib/routines.c 2013-06-20 Jens Rehsack Add some test TODO. Hash: 7f0a8457df10b4fa0739cd392133173d0d7f5dac Files affected: TODO 2013-06-20 Jens Rehsack Improve tests. * Renamed the existing tests to */full_test.t - pretending they test the statgrab calls providing full statistics (in contrary to difference statistics). * Introduced a way to test the stats differences (root cause for yesterdays missing disk names in saidar). * Added missing network_iface_stats test to the full tests. Hash: 6ba73b5848aba1455e62d7421f01d7595434a5d6 Files affected: tests/multi_threaded/Makefile.am tests/multi_threaded/diff_stats.c tests/multi_threaded/full_stats.c tests/multi_threaded/multi_threaded_test.c tests/single_threaded/Makefile.am tests/single_threaded/diff_stats.c tests/single_threaded/full_stats.c tests/single_threaded/single_threaded_test.c tests/testlib/routines.c tests/testlib/testlib.h 2013-06-20 Jens Rehsack Include stats delivered into tests. (superfluous src/statgrab/statgrab cpu. mem. load. user. swap. general. fs. disk. net. page.) Hash: b1f3cc6f46ccbdd3669cf11419014e66a5bf961e Files affected: tests/multi_threaded/multi_threaded_test.c tests/single_threaded/single_threaded_test.c tests/testlib/routines.c tests/testlib/run_tests.pm tests/testlib/testlib.h 2013-06-19 Jens Rehsack Introduce --enable-logging. This will enforce fprintf(stderr, ...) when built without log4cplus. Hash: 83cc6f5e611d985d03a5a98e010bb921eb308b04 Files affected: configure.ac src/libstatgrab/disk_stats.c src/libstatgrab/globals.c src/libstatgrab/trace.h 2013-06-19 Jens Rehsack Fix core because of fiddled vector functions. Hash: 31f220dabbefe27f6ecdb5559064cc5db3da6973 Files affected: src/libstatgrab/disk_stats.c src/libstatgrab/network_stats.c src/libstatgrab/process_stats.c src/libstatgrab/vector.c src/libstatgrab/vector.h 2013-06-19 Jens Rehsack Remove compiler warnings. Hash: 6c19ee2985d3e3e15dccb365ebd824bd5496c8ea Files affected: src/libstatgrab/memory_stats.c src/libstatgrab/page_stats.c src/libstatgrab/process_stats.c src/libstatgrab/swap_stats.c src/libstatgrab/tools.c 2013-06-18 Jens Rehsack Fix reaction on integer overflow. Hash: 6c9a93eb6198cd03199dd35922037ab24070a18d Files affected: src/libstatgrab/disk_stats.c 2013-06-18 Jens Rehsack OpenBSD and Darwin process_stats fixes. Hash: f5958a6ccbf13b471ec3c5d191a5c4d36796bd4f Files affected: src/libstatgrab/process_stats.c 2013-06-18 Jens Rehsack Consolidation... - fix extra warnings: -Wshadow -Wstrict-overflow -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wpadded -Wunreachable-code seen on Darwin, *BSD ... using system compiler. - consolidate pagesize and mach_host_self retrieval. Hash: 3ca75e1836f99268192320a65f49f4d128837512 Files affected: TODO src/libstatgrab/error.h src/libstatgrab/globals.h src/libstatgrab/memory_stats.c src/libstatgrab/network_stats.c src/libstatgrab/page_stats.c src/libstatgrab/process_stats.c src/libstatgrab/swap_stats.c src/libstatgrab/tools.c src/libstatgrab/vector.c src/libstatgrab/vector.h 2013-06-18 Jens Rehsack Add Token Ring and 802.11 support. + detect FDDI - but no speed there... Hash: 499071aa0f70627dda6a987d0b7da5a5b4e337d3 Files affected: src/libstatgrab/network_stats.c 2013-06-18 Jens Rehsack Alignment / network stats. * Fix alignment issues for network_iface stats. * Fix some stats related to network iface (speed etc.). Hash: 2870ac0d07156204f75d0152d58b89f4eaaf7ccd Files affected: examples/network_iface_stats.c src/libstatgrab/network_stats.c src/libstatgrab/statgrab.h.in src/statgrab/statgrab.c 2013-06-18 Jens Rehsack Fix probably unsafe assignments and warnings. Hash: cf8675b252b74996a835d95df579e4fd3bedb17a Files affected: src/libstatgrab/process_stats.c 2013-06-18 Jens Rehsack Remove more or less pointless warnings. Hash: d7446753e73a8ab154577d96fd1f08281c4c9ae4 Files affected: src/libstatgrab/globals.c src/libstatgrab/tools.c src/libstatgrab/vector.c src/libstatgrab/vector.h 2013-06-18 Jens Rehsack Review Solaris device mapping initialization. -> readdir is okay, sg_init() should be called from main. (if we want support sg_init() can be called from threads, we must fix that, otherwise we'll get stack overflow) -> cleanup code a bit to understand better what's going on. Hash: 0bca044cfe79201014050e0711ad2c4fb7d05039 Files affected: src/libstatgrab/tools.c 2013-06-18 Jens Rehsack Fix another overflow bug. Hash: f30f1d34857c8b34bf3d3ac02d812299943d0906 Files affected: src/libstatgrab/globals.c 2013-06-18 Jens Rehsack Fixing the broken readdir_r with stack dirent too. Hash: de9e7878570f9147494e982a007fcf23b74499a5 Files affected: src/libstatgrab/disk_stats.c 2013-06-17 Jens Rehsack Fix pointless type warning. Hash: 338068c62fb88b1bf2e4eb1c0cf0fb2fd17162b1 Files affected: src/libstatgrab/user_stats.c 2013-06-17 Jens Rehsack Remove BSD quirks and API changes from TODO. Hash: 02f2d26bc3ed41d25257d9c62b831e2a59f5927f Files affected: TODO 2013-06-17 Jens Rehsack Document entries parameter in SYNOPSIS. Hash: 7a91e12d6453305aa1f11cea7c51047798b26104 Files affected: docs/libstatgrab/sg_get_cpu_stats.xml docs/libstatgrab/sg_get_host_info.xml docs/libstatgrab/sg_get_load_stats.xml docs/libstatgrab/sg_get_mem_stats.xml docs/libstatgrab/sg_get_page_stats.xml 2013-06-17 Jens Rehsack Cleanup memory even without threads. Hash: 91966c2b57917bd981478666f595b4696eaa18a0 Files affected: src/libstatgrab/globals.c 2013-06-17 Jens Rehsack Fix user-stats on DragonFly BSD. DragonFly BSD seems to be the only one that comes with getutxent() and getutent() and depending on system setup one works or the other. Hash: 9877f4dd6a8f89076e875d39e284c217d958d3f8 Files affected: configure.ac src/libstatgrab/tools.h src/libstatgrab/user_stats.c 2013-06-17 Jens Rehsack Fix broken process stats on OpenBSD. This fix includes an adaption to an early behaviour common to OpenBSD and DragonflyBSD. OpenBSD improves and needs different (but hard to check) behaviour. Currently we have a state working on both recent releases - further tests on -STABLE might show what remains... Hash: f2819bcb67c51c8655a4051a4e18d92f64d2fd3a Files affected: src/libstatgrab/process_stats.c 2013-06-17 Jens Rehsack Review memory stats. Review memory stats related to "Belongs cached to free?" * http://simon.zekar.com/2009/01/30/understanding-freebsd-memory-usage/ Even if FreeBSD currently always reports "0" for cached, we might be safer for future versions. Similar is to expect for other BSD's. Hash: 718d6758d60065563c68a1533638e1111f86fe05 Files affected: src/libstatgrab/memory_stats.c 2013-06-14 Jens Rehsack In case something went wrong free got ifaddrs. Hash: d33064e19bd6f577824c40034e1094e8911f49a3 Files affected: src/libstatgrab/network_stats.c 2013-06-13 Tim Bishop TODO updates. Hash: 0352d080ae432883312764118b336d4054d90875 Files affected: TODO 2013-06-13 Tim Bishop Remove support for deprecated interfaces. As we head towards 1.0 this is no longer needed. With all the other changes it becomes irrelevant anyway. Hash: 570db97a244cf56d1ced638dc3015d395f37ced2 Files affected: configure.ac src/libstatgrab/Makefile.am src/libstatgrab/network_stats.c src/libstatgrab/statgrab.h.in src/libstatgrab/statgrab_deprecated.c src/libstatgrab/statgrab_deprecated.h 2013-06-13 Jens Rehsack Add Darwin support for disk-I/O based on I/O-Kit. Hash: 43bb39cfd55e527d3f39403807c4ffb87b3deaf7 Files affected: src/libstatgrab/disk_stats.c 2013-06-13 Jens Rehsack Add file:line to error output (for tracing). Hash: ec3e84ee440d1448f1a5bcca6ece9d178a2e272c Files affected: src/libstatgrab/error.h 2013-06-13 Jens Rehsack Add error for IO.Kit errors. Hash: 57147832e09e8ebf86f8e4842f1edf54a8a05ec2 Files affected: src/libstatgrab/error.c src/libstatgrab/statgrab.h.in 2013-06-13 Jens Rehsack Explicitly take darwin out of vmtotal mem stats. Darwin is Mach based, we're using host_statistics() instead. Hash: b758b29e56ed758328758b588ca732de1f8745fb Files affected: src/libstatgrab/memory_stats.c 2013-06-13 Tim Bishop Bump version in preparation for new release. We've decided to go to 0.90 because there are a number of changes to the API that will require programs to be changed. We've put changes in that aren't strictly necessary yet to get all the currently planned API changes done in one go. Also bump the shared library version accordingly. Hash: 3670306614a688367fb1bb1820b9288d30846c7f Files affected: configure.ac src/libstatgrab/Makefile.am 2013-06-13 Jens Rehsack Update and refine TODO. Hash: 604baed8fe1a2f903f14f3d34b382784d516659b Files affected: TODO 2013-06-13 Jens Rehsack Improve paging stats. * use mach stats like for memory on Mach systems. * use uvmexp/evmexp_sysctl explicitly where supported and no dirty rough OS detection based fallback like fbsd forces it because sysctlbyname() cannot be reasonable checked (think cross-compiling). Hash: bde7a2c4f2fdcee310b0ac63414823992203e846 Files affected: src/libstatgrab/page_stats.c 2013-06-13 Jens Rehsack If HW_MACHINE_ARCH unusable try HW_MACHINE. Hash: 0ae724c9a2bf44440634059cb5b07cc239c4f562 Files affected: src/libstatgrab/os_info.c 2013-06-13 Jens Rehsack Remove completed items. Hash: ce306b236c38d9fea855d3cfd4c392d9a42fa1a3 Files affected: TODO 2013-06-12 Jens Rehsack Correct indention level and fix core on HP-UX. Hash: 3ae26a96701062d41e3fbc4f9bdf09a09706b12f Files affected: src/libstatgrab/globals.c 2013-06-12 Jens Rehsack Fix 32-/64-bit issue found thanks to HP-UX. Hash: d3ec41c2788bbc53b233d339b9978fa500909be4 Files affected: tests/multi_threaded/multi_threaded_test.c 2013-06-12 Jens Rehsack Silence most HP-ANSI C Compiler warnings. Hash: 3c45fa103329d9cb458491771ad544e33f79ca06 Files affected: src/libstatgrab/disk_stats.c src/libstatgrab/network_stats.c src/libstatgrab/process_stats.c src/libstatgrab/vector.h 2013-06-12 Jens Rehsack Unify API - all stats grabbers now output entries. In former times, only those stats grabbers which return (likely) multiple items had an optional size_t output argument "entries". Meanwhile, it would be possible to grab cpu stats per CPU, load stats per CPU, swap stats per swap device etc. Even if the content of those stats might be worth being discussed, breaking API multiple times isn't recommended. With coming release, most developers have to fix their callers anyway (from int * => size_t *), having some additional fix points doesn't bother more. Hash: 01fc0cab83cb36d46ab50f9ac8602fabcc8f97c0 Files affected: examples/cpu_usage.c examples/load_stats.c examples/os_info.c examples/page_stats.c examples/vm_stats.c src/libstatgrab/cpu_stats.c src/libstatgrab/globals.h src/libstatgrab/statgrab.h.in src/saidar/saidar.c src/statgrab/statgrab.c tests/testlib/routines.c tests/testlib/testlib.h 2013-06-12 Jens Rehsack Make scaled output a bit more natural looking. 16376MB -> 16GB, instead of 15GB Hash: 417ad5b0fa5da8add49bd1b2ea5a35114b5ef608 Files affected: src/statgrab/statgrab.c 2013-06-11 Jens Rehsack Update TODO. Hash: ec16741fff24831d1f5b806e0422b9bccffda9eb Files affected: TODO 2013-06-11 Jens Rehsack Print errors to stderr. Hash: f6bf7249c9c7442639edd8d37030dcb9e0df5b8d Files affected: src/statgrab/statgrab.c 2013-06-11 Jens Rehsack Add reminder to TODO. Hash: fbde9b66e60c6eed39442d1563bae7c8f88fd9db Files affected: TODO 2013-06-11 Jens Rehsack Darwin fixes. Hash: 20a9c01373125265448477d3c1464a281a07c70c Files affected: configure.ac src/libstatgrab/memory_stats.c src/libstatgrab/swap_stats.c 2013-06-11 Jens Rehsack De-facto don't use vmmeter - it's deprecated. Hash: 7a6101d36d908bbf0ff3955e433f5e9be7bd445b Files affected: src/libstatgrab/cpu_stats.c 2013-06-11 Jens Rehsack Fix typo. Hash: 5b7cf34b3eedcf10e28fcdaf5407c16c133a70e6 Files affected: src/libstatgrab/error.h 2013-06-11 Jens Rehsack Temporarily increase FBSD > HAVE_STRUCT_VMTOTAL. Hash: f93fd49e00f8d06ad91f23566d21d0e92f3ce020 Files affected: src/libstatgrab/memory_stats.c 2013-06-11 Jens Rehsack Recognize hw.usermem. In case the system provides an hw.usermem in addition to hw.physmem, increase used memory by the difference of usermem to physmem. Hash: fa69ad066ceb03005b61ba900b8dbd78c83bc8bd Files affected: src/libstatgrab/memory_stats.c 2013-06-10 Jens Rehsack Try to get rid of bogus isspace warnings. Improve isspace invocation as recommended in http://netbsd.2816.n7.nabble.com/Casting-ctype-lookups-td268928.html Hash: cd3b5f9241d79920e42f9604118dcfb6cd4358c0 Files affected: src/saidar/saidar.c src/statgrab/statgrab.c 2013-06-10 Jens Rehsack Try alignment helper check with long long. Hash: 94694528decead052c7499b8ee976b5ab4af0f11 Files affected: m4/ax_types.m4 2013-06-10 Jens Rehsack Solve overflow calculation hopefully clearer. Hash: 51da4e542d1923253ab67a32e11f240b95d365a0 Files affected: src/libstatgrab/network_stats.c 2013-06-10 Jens Rehsack Fix some warnings. Hash: f453f5a91e1a7dafc6c4583d36bc942b3102484f Files affected: src/libstatgrab/os_info.c src/libstatgrab/process_stats.c src/libstatgrab/swap_stats.c 2013-06-10 Jens Rehsack Use sg_get_sys_page_size(). Hash: 41d2f044a73dcfc9c3178f21ee72beb136b89268 Files affected: src/libstatgrab/memory_stats.c 2013-06-10 Jens Rehsack Fix typo. Hash: 239beb5723426a70ce6b470f524f0126f33b0518 Files affected: src/libstatgrab/globals.h 2013-06-10 Jens Rehsack ERROR_OVERRIDE_PROTECTION without vsnprintf only. define ERROR_OVERRIDE_PROTECTION only without vsnprintf. Hash: df8fdfe605f637bd350a9c58380cf76329605650 Files affected: src/libstatgrab/error.c 2013-06-10 Jens Rehsack Fix typo on pthread_mutex_timedwait(). Hash: 7ba72dcab94d9c591fa7cff050f1e322db682287 Files affected: tests/multi_threaded/multi_threaded_test.c 2013-06-10 Jens Rehsack Use special address arithmetic only as necessary. Hash: 7a33b818ea1b97ff5198f795ae093fae924430d1 Files affected: configure.ac m4/ax_types.m4 src/libstatgrab/vector.h 2013-06-10 Jens Rehsack Unify offsetof code - should work on any target. Hash: 14dcbdc35054dec7f106e52c668378b738b6c691 Files affected: src/libstatgrab/tools.h 2013-06-10 Jens Rehsack Consolidate type checks in one file. Hash: 3c51fe9ab228fcd02cf6a98eee5dd7496c28b065 Files affected: m4/ax_type_fmt.m4 m4/ax_types.m4 2013-06-10 Jens Rehsack Improve format string checker. Hash: f02814491f1af5899c240dc433cbce385cd8aae7 Files affected: configure.ac m4/ax_type_fmt.m4 m4/ax_types.m4 2013-06-10 Jens Rehsack Rollback type conv changes that break some BSDs. Hash: 4e9da99796989065477e91ada22f174d34922ead Files affected: src/libstatgrab/disk_stats.c 2013-06-10 Jens Rehsack Check for right type for printf/scanf types. To avoid warnings for correct type formatter used when printf/scanf pid_t, uid_t, gid_t or time_t. Hash: 25a62d207388988f6ef7ee7dc1275eeecc76917b Files affected: configure.ac m4/ax_type_fmt.m4 src/libstatgrab/process_stats.c 2013-06-09 Jens Rehsack Remove some clang warnings. Hash: 19eb3538d314aa75c25c780f41fce8143b8d10e2 Files affected: src/libstatgrab/disk_stats.c src/libstatgrab/tools.h src/libstatgrab/vector.h 2013-06-09 Tim Bishop Fix warnings with PTHREAD_ONCE_INIT on Solaris. On Solaris PTHREAD_ONCE_INIT needs to be in braces. This change adds a configure check to test if this is needed and add it where appropriate. Do the same for PTHREAD_MUTEX_INITIALIZER. This change is derived from: (as it is of today's date) http://git.savannah.gnu.org/gitweb/?p=guile.git;a=blob_plain;f=configure.ac;hb=HEAD Hash: 20999dcecc894b099b1193b3e0ff0d3e3b01e9b8 Files affected: configure.ac src/libstatgrab/globals.c tests/multi_threaded/multi_threaded_test.c 2013-06-09 Jens Rehsack Eliminate signed and unsigned integer comparisons. Hash: 8767385673e21a2b68f7b240dfd17b9ce655bb77 Files affected: src/libstatgrab/swap_stats.c 2013-06-09 Tim Bishop Remove warnings: variable unused after assignment. In both cases the result of a function is assigned to a variable, but that variable is never used. This change removes the compiler warning this generates, but it should probably be reviewed to check if instead we should be doing something with the variable. Hash: 61bb360e4f7e095f7577d22e380e02fe77109e49 Files affected: src/libstatgrab/process_stats.c src/saidar/saidar.c 2013-06-09 Tim Bishop isspace needs . Hash: 9e12be293802a9860b08b2035a2aca1909a8b090 Files affected: src/saidar/saidar.c 2013-06-09 Tim Bishop Remove warning: pid may not be an int, so cast it. Hash: fe32905cfebf0426a467276931f7130e5e686c72 Files affected: examples/user_list.c src/libstatgrab/process_stats.c 2013-06-08 Tim Bishop Fix build when threads are disabled. Hash: 7dec315c48d7fcf190e36b241abbada58d994f69 Files affected: src/libstatgrab/globals.c src/libstatgrab/os_info.c src/libstatgrab/user_stats.c 2013-06-08 Tim Bishop Revert change to saidar includes to fix build. Hash: 52444f72fe425aa93a51e17d5c7d0e1c6dccd042 Files affected: src/saidar/saidar.c 2013-06-07 Tim Bishop Add todo for FreeBSD memory stats. Hash: 3576341e6a52cb53593598d0818cdb20eb55067d Files affected: TODO 2013-06-07 Jens Rehsack Clean up evaluation of test success. Hash: 35078dbeb887e06c0c8fa7af1ebefea3d379fa57 Files affected: tests/testlib/run_tests.pm 2013-06-07 Jens Rehsack Remove warnings when compiling without logging. Hash: 24f5062ff669511ec50f2ce86e72120700b978fb Files affected: src/libstatgrab/globals.h 2013-06-07 Jens Rehsack Catch Darwin's shared objects too. Hash: 6c65dabcb684f9ed025dc4df0f5778078152cece Files affected: m4/ax_lib.m4 2013-06-07 Tim Bishop Remove DOCTYPE from the DocBook manual pages. For me they build exactly the same but don't make a bunch of network calls to www.oasis-open.org. This is a lot quicker and more reliable (I frequently got build failures due to network problems before). Hash: 70a22adf3c3f71c6bfc0b926070aaed3fd36be75 Files affected: docs/libstatgrab/sg_comp_init.xml docs/libstatgrab/sg_get_cpu_stats.xml docs/libstatgrab/sg_get_disk_io_stats.xml docs/libstatgrab/sg_get_error.xml docs/libstatgrab/sg_get_fs_stats.xml docs/libstatgrab/sg_get_host_info.xml docs/libstatgrab/sg_get_load_stats.xml docs/libstatgrab/sg_get_mem_stats.xml docs/libstatgrab/sg_get_network_iface_stats.xml docs/libstatgrab/sg_get_network_io_stats.xml docs/libstatgrab/sg_get_page_stats.xml docs/libstatgrab/sg_get_process_stats.xml docs/libstatgrab/sg_get_user_stats.xml docs/libstatgrab/sg_init.xml docs/libstatgrab/sg_internal-intro.xml docs/libstatgrab/sg_intro.xml docs/libstatgrab/sg_lock_mutex.xml docs/libstatgrab/sg_set_error.xml docs/libstatgrab/sg_vector_create.xml docs/libstatgrab/statgrab.xml docs/saidar/saidar.xml docs/statgrab/statgrab-make-mrtg-config.xml docs/statgrab/statgrab-make-mrtg-index.xml docs/statgrab/statgrab.xml 2013-06-07 Jens Rehsack Add temporary file to track open issues. Hash: 170eabac87a76f75ab7e9eadacae36c98440c893 Files affected: TODO 2013-06-06 Jens Rehsack Clean up scanned fs names. Hash: 863d6c887ce3e4bc1200809d679eb74dc96beed9 Files affected: src/saidar/saidar.c src/statgrab/statgrab.c 2013-06-06 Jens Rehsack Provide strndup replacement. Hash: 5733c7eea94ebf3930d177cd3b66de038202841e Files affected: configure.ac src/saidar/saidar.c src/statgrab/statgrab.c 2013-06-06 Jens Rehsack Improve speed of mt-tests. Hash: c2154f075d1bbc6e83ea2deab697160b889d206a Files affected: tests/multi_threaded/multi_threaded_test.c 2013-06-06 Jens Rehsack Improve output from tests. 1) Tell the executed command. 2) Reduce un-needed reports. Hash: 32c155d8577b1f38588605128a300cbcce63098a Files affected: tests/multi_threaded/multi_threaded_test.c tests/testlib/run_tests.pm 2013-06-06 Jens Rehsack Introduce file system filtering. Hash: 5477ba9d64f7c0b8c5549ee7d88c7ccc4470de85 Files affected: src/saidar/saidar.c src/statgrab/statgrab.c 2013-06-06 Jens Rehsack Avoid having uninitialized clone target on fail. Hash: 04b3fdeab02bb0cef643b785c1a39424fda3bf67 Files affected: src/libstatgrab/vector.c 2013-06-06 Jens Rehsack optarg is declared in . Hash: 5098a8bc86a778ee5dd88b4805a40d3aaf54831c Files affected: examples/user_list.c 2013-06-05 Jens Rehsack Lock mutex before starting threads. Lock mutex before starting threads avoids threads running before everything is set up. Hash: 828900b5fd9576d34e12925c21e4627fc36a9b99 Files affected: tests/multi_threaded/multi_threaded_test.c 2013-06-04 Jens Rehsack Make sys_page_size static. When having static sg_get_sys_page_size(), sys_page_size must be static too (duplicated symbol otherwise). Hash: f9336eb41c49978734b720f9c5db618c2afb1c72 Files affected: src/libstatgrab/tools.h 2013-06-04 Jens Rehsack xsw_usage wasn't approved - done with Darwin. Hash: 2f45c35e1aaf30a32c38cc2c207ae50bb0ef4436 Files affected: src/libstatgrab/swap_stats.c 2013-06-04 Jens Rehsack File system stats fixes for Darwin. Hash: 7202a0160e253428a0c46930a2e199e3aedc5383 Files affected: src/libstatgrab/disk_stats.c 2013-06-04 Jens Rehsack Fix calling convention. Hash: d261d852ceeca9acf2b3bf41af8a2f903f6b31c3 Files affected: src/libstatgrab/cpu_stats.c 2013-06-04 Jens Rehsack Fix detecting right mach include files. Hash: 9c404aab0e347229ac6f9058b068ad32d90d5fba Files affected: configure.ac src/libstatgrab/tools.h 2013-06-04 Jens Rehsack Move mark_func to avoid race conditions. Move mark_func in front of thread start to avoid race conditions while waiting on systems with to many CPUs. Hash: 8340bbc4969e295457e1837a1f83a9600d05da78 Files affected: tests/multi_threaded/multi_threaded_test.c 2013-06-04 Jens Rehsack Fix typo in messages. Hash: f1b3feefc6fc512d32d03332de2c3cfacf8cfaad Files affected: tests/testlib/routines.c 2013-06-04 Tim Bishop Fix typos. Hash: 2b640747c295906a0af35272175b8c3857840877 Files affected: m4/ax_ncurses.m4 2013-06-03 Jens Rehsack Make MP_WITH_CURSES autoconf macro -Werror safe. Hash: 389f535d5fcc9bfa64693f52fa1e4d79dc535371 Files affected: m4/ax_ncurses.m4 src/saidar/saidar.c 2013-06-03 Jens Rehsack Disable threading by default on DragonFly BSD. This is because of strange looking malloc behavior. Hash: 52d392beb46c5be7f8e86d61e1ff5e527de97fb9 Files affected: configure.ac 2013-06-03 Jens Rehsack fabs(3) needs -lm on HP-UX too. Hash: e541562a3732ee6818f3c1364d806dd6b672166a Files affected: configure.ac 2013-06-03 Jens Rehsack Fix __VA_ARGS__ use to make more like STDC. Hash: 62d22daee7d771313100f880e41f6006a61fe334 Files affected: src/libstatgrab/error.h src/libstatgrab/trace.h 2013-06-02 Jens Rehsack Fix kinfo_proc related issues with OpenBSD 5.3. Hash: 8e819e1f5944b393d6eabde28b97f2f0655d0e56 Files affected: configure.ac src/libstatgrab/process_stats.c 2013-06-01 Tim Bishop Update copyright year. Hash: 38a83a568825d2daba0b49bba5fe121b3267d15c Files affected: examples/cpu_usage.c examples/disk_traffic.c examples/filesys_snapshot.c examples/helpers.c examples/helpers.h examples/load_stats.c examples/network_iface_stats.c examples/network_traffic.c examples/os_info.c examples/page_stats.c examples/process_snapshot.c examples/process_stats.c examples/user_list.c examples/valid_filesystems.c examples/vm_stats.c src/libstatgrab/cpu_stats.c src/libstatgrab/disk_stats.c src/libstatgrab/error.c src/libstatgrab/error.h src/libstatgrab/globals.c src/libstatgrab/globals.h src/libstatgrab/load_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/network_stats.c src/libstatgrab/os_info.c src/libstatgrab/page_stats.c src/libstatgrab/process_stats.c src/libstatgrab/statgrab.h.in src/libstatgrab/statgrab_deprecated.c src/libstatgrab/statgrab_deprecated.h src/libstatgrab/swap_stats.c src/libstatgrab/tools.c src/libstatgrab/tools.h src/libstatgrab/trace.h src/libstatgrab/user_stats.c src/libstatgrab/vector.c src/libstatgrab/vector.h src/saidar/saidar.c src/statgrab/statgrab-make-mrtg-config.in src/statgrab/statgrab-make-mrtg-index.in src/statgrab/statgrab.c tests/multi_threaded/multi_threaded_test.c tests/single_threaded/single_threaded_test.c tests/testlib/err.c tests/testlib/log.c tests/testlib/opt.c tests/testlib/routines.c tests/testlib/testlib.h 2013-05-31 Tim Bishop Manually pull the latest config.{guess,sub}. This is a temporary workaround. Hash: 85380029a6c690a6827b4379b837dde27dc66a95 Files affected: autogen.sh 2013-05-31 Jens Rehsack Fix some Solaris crashes and linking issues. Hash: ca0fb5e4e46fa9aa21ca644b504838d579b8b05b Files affected: src/libstatgrab/process_stats.c src/libstatgrab/swap_stats.c src/libstatgrab/tools.h 2013-05-31 Tim Bishop Use tty rather than username to group user stats. Hash: 94e49ba3f5adea6c30cd27e279abc4ebb894d75d Files affected: src/statgrab/statgrab.c 2013-05-31 Jens Rehsack Fix lifr used before initialized. (AIX network interface stats) Hash: 362e60afe0fa0487fd94665ea8e7588fe609368d Files affected: src/libstatgrab/network_stats.c 2013-05-31 Jens Rehsack Correct statgrab.c internal function prototypes. Hash: 291a2ea2e90290c1c43538e2bab8541193071b21 Files affected: src/statgrab/statgrab.c 2013-05-31 Jens Rehsack Make sg_get_sys_page_size inline. This avoids possible warnings about unused function definitions. Hash: a6dc7502743476513fa6ac807e3780992544fd2c Files affected: src/libstatgrab/tools.h 2013-05-31 Jens Rehsack Prevent init errors on systems without vsnprintf. Hash: 1bb91ce5458c5dfa59cfa15cb523ae8f2fd9f995 Files affected: src/libstatgrab/error.c 2013-05-31 Jens Rehsack Re-order header/function checks. Hash: 14bbd9a32802f39e47fe3aff9e876138d00e4770 Files affected: configure.ac 2013-05-31 Tim Bishop Pull in before . On old FreeBSD (tested on 6), param.h is needed by user.h. Move the order around accordingly. Will need to confirm this doesn't break other systems. Hash: a45cf7cfdc2bd74c6e05b65caefddd6572fbfefb Files affected: src/libstatgrab/tools.h 2013-05-31 Tim Bishop Add missing "test" to configure.ac. Hash: bf29196b88ca2ad65792712faf6c72979892ab3f Files affected: configure.ac 2013-05-30 Tim Bishop Fix typo. Hash: 80721fbd894c957724e0d8215052decce345ad37 Files affected: src/statgrab/statgrab.c 2013-05-30 Tim Bishop Re-add user.num and user.names for compatibility. Libstatgrab no longer directly provides these statistics, so calculate them within statgrab for compatibility with older versions. Hash: 750a51d9e306c29902ae8b1d0f73988cc4dec444 Files affected: src/statgrab/statgrab.c 2013-05-30 Tim Bishop Add missing sg_prove_vector.3 manual page. Hash: 00739d27247ac0e788ddeb21c7748f7d71ca9f1a Files affected: docs/libstatgrab/Makefile.am 2013-05-30 Jens Rehsack Rework STDC header checks. Hash: e2f970594953ad62468fb1ddddbd6c966f9e0892 Files affected: configure.ac src/libstatgrab/tools.h 2013-05-30 Jens Rehsack Ignore the DEVSTAT_TYPE_PASS flag. The device must have a type anyway. Hash: 707a657fc26c6ddc8ede04118ccda724d9dcc775 Files affected: src/libstatgrab/disk_stats.c 2013-05-30 Jens Rehsack Add .gitignore file. Hash: 73730eea49fa87571a4786ebeb5278718780b09b Files affected: .gitignore 2013-05-30 Jens Rehsack Check for termios.h headers for saidar only. Hash: 5176533a6dc4daa7d1539e4b3f9f119c287fb7b5 Files affected: configure.ac 2013-05-29 Tim Bishop Check for termios.h and sys/termios.h headers. Hash: e46534ac32659cd0ce005f780ffc232f13d696c9 Files affected: configure.ac src/saidar/saidar.c 2013-05-29 Tim Bishop Put the correct date in manual pages. Hash: 7700a7ff3fa35cdfd10f01c97a6815ec03cb825c Files affected: docs/libstatgrab/Makefile.am docs/libstatgrab/sg_comp_init.xml docs/libstatgrab/sg_get_cpu_stats.xml docs/libstatgrab/sg_get_disk_io_stats.xml docs/libstatgrab/sg_get_error.xml docs/libstatgrab/sg_get_fs_stats.xml docs/libstatgrab/sg_get_host_info.xml docs/libstatgrab/sg_get_load_stats.xml docs/libstatgrab/sg_get_mem_stats.xml docs/libstatgrab/sg_get_network_iface_stats.xml docs/libstatgrab/sg_get_network_io_stats.xml docs/libstatgrab/sg_get_page_stats.xml docs/libstatgrab/sg_get_process_stats.xml docs/libstatgrab/sg_get_user_stats.xml docs/libstatgrab/sg_init.xml docs/libstatgrab/sg_internal-intro.xml docs/libstatgrab/sg_intro.xml docs/libstatgrab/sg_lock_mutex.xml docs/libstatgrab/sg_set_error.xml docs/libstatgrab/sg_vector_create.xml docs/libstatgrab/statgrab.xml docs/saidar/Makefile.am docs/saidar/saidar.xml docs/statgrab/Makefile.am docs/statgrab/statgrab-make-mrtg-config.xml docs/statgrab/statgrab-make-mrtg-index.xml docs/statgrab/statgrab.xml 2013-05-29 Tim Bishop Various cleanups and corrections of manual pages. Hash: 1f9318031b10d32f986f999bc42c36335b873add Files affected: docs/libstatgrab/sg_comp_init.xml docs/libstatgrab/sg_get_cpu_stats.xml docs/libstatgrab/sg_get_disk_io_stats.xml docs/libstatgrab/sg_get_error.xml docs/libstatgrab/sg_get_fs_stats.xml docs/libstatgrab/sg_get_host_info.xml docs/libstatgrab/sg_get_load_stats.xml docs/libstatgrab/sg_get_mem_stats.xml docs/libstatgrab/sg_get_network_iface_stats.xml docs/libstatgrab/sg_get_network_io_stats.xml docs/libstatgrab/sg_get_page_stats.xml docs/libstatgrab/sg_get_process_stats.xml docs/libstatgrab/sg_get_user_stats.xml docs/libstatgrab/sg_init.xml docs/libstatgrab/sg_internal-intro.xml docs/libstatgrab/sg_intro.xml docs/libstatgrab/sg_lock_mutex.xml docs/libstatgrab/sg_set_error.xml docs/libstatgrab/sg_vector_create.xml docs/libstatgrab/statgrab.xml 2013-05-29 Tim Bishop Looks like sys/timeb.h isn't used. Hash: fb43acc5acd0a1321500f0f3c10a9618f9e78ffd Files affected: configure.ac src/libstatgrab/tools.h 2013-05-29 Tim Bishop Add testlib.h header to dist. Hash: 4a40b47526affa359eec06a612bbd47d2fcda7b5 Files affected: tests/testlib/Makefile.am 2013-05-29 Jens Rehsack Reintroduce -Werror automake flag. Hash: ea31edff4150dcbe0026e6d12cae521fda056ffe Files affected: configure.ac 2013-05-29 Jens Rehsack Rename ACX_* macros into AX_*, and remove gettext. Hash: 80b8621a3c46a67ec4f685b2973afbd671768a50 Files affected: Makefile.am configure.ac m4/ax_lib.m4 m4/ax_perl5.m4 m4/ax_pthread.m4 m4/ax_shellvars.m4 m4/ax_visibility.m4 m4/ax_win32.m4 m4/ax_xopen.m4 2013-05-29 Jens Rehsack Renaming acx_*.m4 to ax_*.m4. Hash: 242afbfabbe9705f0884f53d9a755ff870a57954 Files affected: m4/acx_lib.m4 m4/acx_ncurses.m4 m4/acx_perl5.m4 m4/acx_pthread.m4 m4/acx_visibility.m4 m4/acx_win32.m4 m4/acx_xopen.m4 m4/ax_lib.m4 m4/ax_ncurses.m4 m4/ax_perl5.m4 m4/ax_pthread.m4 m4/ax_visibility.m4 m4/ax_win32.m4 m4/ax_xopen.m4 2013-05-29 Jens Rehsack Rename run_tests.pl.in to run_tests.t.in. Hash: 469bf91017701eaad9e23aeae675bf2d044dc404 Files affected: tests/multi_threaded/Makefile.am tests/single_threaded/Makefile.am 2013-05-29 Jens Rehsack Remove -Werror until the gettext stuff is fixed. 'warning: The 'AM_PROG_MKDIR_P' macro is deprecated, and will soon be removed.' Hash: 3a45027381651b4014b4c819ff19b863b395841a Files affected: configure.ac 2013-05-29 Jens Rehsack Enforce building manual pages for maintainers. Hash: a7698f998f30037d30aedde6f8dab13004c58693 Files affected: configure.ac 2013-05-29 Tim Bishop Update configure.ac with changes from autoupdate. Hash: b4c776755c07482d33a9b91de75fce558b9ecf4a Files affected: configure.ac 2013-05-28 Tim Bishop Generate a ChangeLog file from the Git history. This is a first attempt at producing something. I wanted to do it without relying on an external tool since there doesn't seem to be a readily packaged one (like cvs2cl). This output looks near enough to the proper ChangeLog format to suffice. Hash: 1653929187b49d75307a9c1e404c8fd595472d9d Files affected: Makefile.am 2013-05-28 Tim Bishop Fix configure script. Hash: f1b22372603e730f23d1205f902f3e23107c4628 Files affected: configure.ac 2013-05-28 Tim Bishop autoreconf does the job of all these tools now. autogen.sh can probably be removed, but it serves as a good reminder as to which command needs to be run. Hash: 26e1447f837c33c3e19d0d87a896f645b2136959 Files affected: autogen.sh 2013-05-28 Jens Rehsack Eliminate some autoconf/automake warnings. Hash: e5bb7f73636e63ba788a6667b259c14a73d18a31 Files affected: configure.ac m4/acx_lib.m4 m4/acx_visibility.m4 m4/acx_xopen.m4 2013-05-28 Jens Rehsack Rename configure.in to configure.ac. Hash: 8a370152e8af4189aff784add61cf5427211c966 Files affected: configure.ac configure.in 2012-04-23 Jens Rehsack Adding disabled gettextize/autopoint. Hash: 798d242476d4543ad0830ea051b8ab30f522d15d Files affected: Makefile.am autogen.sh configure.in 2012-02-06 Jens Rehsack Fix compiler error. Fix empty va_list argument preparation for newer GNU compilers. Hash: f1dca0bf013b10744e232beb5a8521883ad23c24 Files affected: src/libstatgrab/error.c 2012-02-04 Tim Bishop Must tell aclocal where our m4 files are. Hash: fdc535ff239b9cf50c729053b96178629b16a534 Files affected: autogen.sh 2012-02-04 Tim Bishop These aren't needed. Hash: c0253c01ead200758a187f58c2a9c0424e0fd024 Files affected: m4/lib-ld.m4 m4/lib-link.m4 m4/lib-prefix.m4 m4/libtool.m4 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 m4/lt~obsolete.m4 2012-01-16 Tim Bishop Add note to fix ChangeLog generation. Hash: 62b4d861fea336f7c738361f86e0b257e3a5d044 Files affected: Makefile.am 2012-01-16 Tim Bishop Whitespace cleanups. Mostly using tabs instead of spaces to ident code, but also removing some trailing whitespace from lines. Hash: 9f21cf9f00d7d74d6aed53a80fabf30dd5e2ef20 Files affected: configure.in docs/libstatgrab/Makefile.am docs/libstatgrab/sg_comp_init.xml docs/libstatgrab/sg_get_load_stats.xml docs/libstatgrab/sg_get_network_iface_stats.xml docs/libstatgrab/sg_get_process_stats.xml examples/cpu_usage.c examples/disk_traffic.c examples/helpers.c examples/network_traffic.c examples/os_info.c examples/process_snapshot.c examples/process_stats.c examples/valid_filesystems.c examples/vm_stats.c m4/lt~obsolete.m4 src/libstatgrab/cpu_stats.c src/libstatgrab/disk_stats.c src/libstatgrab/error.c src/libstatgrab/globals.c src/libstatgrab/load_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/network_stats.c src/libstatgrab/os_info.c src/libstatgrab/page_stats.c src/libstatgrab/process_stats.c src/libstatgrab/statgrab.h.in src/libstatgrab/swap_stats.c src/libstatgrab/tools.c src/libstatgrab/user_stats.c src/libstatgrab/win32.c src/saidar/Makefile.am src/saidar/saidar.c src/statgrab/Makefile.am src/statgrab/statgrab.c tests/multi_threaded/multi_threaded_test.c tests/single_threaded/single_threaded_test.c tests/testlib/err.c tests/testlib/mix_tests.pm tests/testlib/routines.c tests/testlib/run_tests.pm tests/testlib/run_tests.t.in 2012-01-16 Tim Bishop Reapply support for FreeBSD 10. This was introduced originally in commit e655fcededb9b4040a8716b24ad8bc2155e31444 but got reverted in the mega patch. Hash: 2217954cd1baae4b9c0d85569d99ffa9d57e0a36 Files affected: configure.in 2012-01-15 Jens Rehsack Merge Jens Rehsack's changes. * thread safety and reentrant functions * complete ports for HP-UX * add support for AIX and Darwin/MacOS X * add experimental support for tracing using log4cplus * remove explicit Linux 2.4 support * improve documentation * add basic test capabilities Thanks Jens! Hash: 63d61ad0541b1a3d88c011ea3e4f50a4bf3089c9 Files affected: AUTHORS Makefile.am NEWS PLATFORMS README acinclude.m4 configure.in docs/libstatgrab/Makefile.am docs/libstatgrab/sg_comp_init.xml docs/libstatgrab/sg_get_cpu_stats.xml docs/libstatgrab/sg_get_disk_io_stats.xml docs/libstatgrab/sg_get_error.xml docs/libstatgrab/sg_get_fs_stats.xml docs/libstatgrab/sg_get_host_info.xml docs/libstatgrab/sg_get_load_stats.xml docs/libstatgrab/sg_get_mem_stats.xml docs/libstatgrab/sg_get_network_iface_stats.xml docs/libstatgrab/sg_get_network_io_stats.xml docs/libstatgrab/sg_get_page_stats.xml docs/libstatgrab/sg_get_process_stats.xml docs/libstatgrab/sg_get_user_stats.xml docs/libstatgrab/sg_init.xml docs/libstatgrab/sg_internal-intro.xml docs/libstatgrab/sg_intro.xml docs/libstatgrab/sg_lock_mutex.xml docs/libstatgrab/sg_set_error.xml docs/libstatgrab/sg_vector_create.xml docs/libstatgrab/statgrab.xml docs/saidar/Makefile.am docs/statgrab/Makefile.am examples/Makefile.am examples/cpu_usage.c examples/disk_traffic.c examples/filesys_snapshot.c examples/helpers.c examples/helpers.h examples/load_stats.c examples/network_iface_stats.c examples/network_traffic.c examples/os_info.c examples/page_stats.c examples/process_snapshot.c examples/process_stats.c examples/user_list.c examples/valid_filesystems.c examples/vm_stats.c libstatgrab-examples.properties m4/acx_lib.m4 m4/acx_ncurses.m4 m4/acx_perl5.m4 m4/acx_pthread.m4 m4/acx_visibility.m4 m4/acx_win32.m4 m4/acx_xopen.m4 m4/lib-ld.m4 m4/lib-link.m4 m4/lib-prefix.m4 m4/libtool.m4 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 m4/lt~obsolete.m4 src/libstatgrab/Makefile.am src/libstatgrab/cpu_stats.c src/libstatgrab/disk_stats.c src/libstatgrab/error.c src/libstatgrab/error.h src/libstatgrab/globals.c src/libstatgrab/globals.h src/libstatgrab/load_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/network_stats.c src/libstatgrab/os_info.c src/libstatgrab/page_stats.c src/libstatgrab/process_stats.c src/libstatgrab/statgrab.h src/libstatgrab/statgrab.h.in src/libstatgrab/statgrab_deprecated.c src/libstatgrab/statgrab_deprecated.h src/libstatgrab/swap_stats.c src/libstatgrab/tools.c src/libstatgrab/tools.h src/libstatgrab/trace.h src/libstatgrab/user_stats.c src/libstatgrab/vector.c src/libstatgrab/vector.h src/libstatgrab/win32.c src/libstatgrab/win32.h src/saidar/Makefile.am src/saidar/saidar.c src/statgrab/Makefile.am src/statgrab/statgrab-make-mrtg-config.in src/statgrab/statgrab-make-mrtg-index.in src/statgrab/statgrab.c tests/Makefile.am tests/multi_threaded/Makefile.am tests/multi_threaded/libstatgrab-test.properties tests/multi_threaded/multi_threaded_test.c tests/multi_threaded/run_tests.synopsis.in tests/single_threaded/Makefile.am tests/single_threaded/libstatgrab-test.properties tests/single_threaded/run_tests.synopsis.in tests/single_threaded/single_threaded_test.c tests/testlib/Makefile.am tests/testlib/err.c tests/testlib/log.c tests/testlib/mix_tests.pm tests/testlib/mk_run_tests.pl tests/testlib/opt.c tests/testlib/routines.c tests/testlib/run_tests.pm tests/testlib/run_tests.t.in tests/testlib/testlib.h 2011-11-11 Tim Bishop Add support for FreeBSD 10. Hash: e655fcededb9b4040a8716b24ad8bc2155e31444 Files affected: configure.in 2011-10-16 Tim Bishop Fix typo. Hash: ab8d8b14d188de58f542e80422019ff46f51aea4 Files affected: docs/saidar/saidar.xml 2010-10-03 Tim Bishop Add support for AIX 5.x - 9.x. Many thanks to Jens Rehsack for providing the patch for this work. Thanks! Hash: 86cfdc1b2d0f0ed6e3671997673bc7f58a1484aa Files affected: configure.in examples/Makefile.am examples/filesys_snapshot.c src/libstatgrab/cpu_stats.c src/libstatgrab/disk_stats.c src/libstatgrab/error.c src/libstatgrab/load_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/network_stats.c src/libstatgrab/os_info.c src/libstatgrab/page_stats.c src/libstatgrab/process_stats.c src/libstatgrab/statgrab.h src/libstatgrab/swap_stats.c src/saidar/saidar.c src/statgrab/statgrab.c 2010-06-09 Tim Bishop Add support for preliminary support for Debian GNU/kFreeBSD. Currently process statistics are broken, but everything else works. The following packages are needed: libkvm-dev libdevstat-dev (plus the usual build stuff required on Debian) Hash: 4997e2fdd9574258349f016b1d57cea5edaa180e Files affected: configure.in 2010-06-09 Tim Bishop Fix link speed on FreeBSD (and others?). Rather than using our own mask make use of the system macro to do it for us. Test on FreeBSD, but a look at if_media.h on the other BSDs suggests it'll work there too. Hash: 274e5fb4e7f59da243ae6d3b6c401eae555bf640 Files affected: src/libstatgrab/network_stats.c 2010-02-21 Tim Bishop Add FreeBSD memory fix and correctly attribute other changes. Hash: 18979ed35c80c08da8dcfcf73f9f2e1f6ba1d6f1 Files affected: NEWS 2010-02-21 Tim Bishop Support larger amounts of memory on FreeBSD. Hash: 6916ad736e417ea0213ed7b0606df3590dd12a73 Files affected: src/libstatgrab/memory_stats.c 2010-02-20 Tim Bishop Post release version increment. Hash: 23867fd5271d2d6d1e95d63e02b6955c915d34af Files affected: configure.in 2010-02-20 Tim Bishop Bump library version and NEWS for next release. Hash: fbc7d1295f91ebce93ca5d4eed7beb85373fe9f4 Files affected: NEWS src/libstatgrab/Makefile.am 2010-02-20 Tim Bishop Support FreeBSD 9. Hash: 1dba0b7e3f4f8d4fee018714e6b21ae0236fbe72 Files affected: configure.in 2010-02-20 Tim Bishop Support utmpx in user_stats as well as utmp. Hash: acbee191f83f95464ecfd7162889f717ffdf2c04 Files affected: configure.in src/libstatgrab/user_stats.c 2009-12-04 Tim Bishop Make list of valid filesystem types dynamic on FreeBSD. Based on patch by Baptiste Daroussin. Hash: 4fb6be65cbd2e1dae174e796f67fd9ac0f171128 Files affected: src/libstatgrab/disk_stats.c 2009-05-16 Tim Bishop FreeBSD has zfs these days. Hash: 41003587516bb24df54e6048e691ac6876d6b0e0 Files affected: src/libstatgrab/disk_stats.c 2008-08-03 Tim Bishop Add zfs to allowed FSs on Solaris. Hash: b0da138dceee4e8cb6dbb68b37205bcf9a5f737a Files affected: src/libstatgrab/disk_stats.c 2008-06-17 Tim Bishop Linux version 2.5.41 or later provides iowait data in /proc/stat. Use it if it's available. Hash: 0a7c9de4ac5e715921b8c384b5f9ff3ec91dc438 Files affected: src/libstatgrab/cpu_stats.c 2008-05-24 Adam Sampson Avoid a GNU-make-ism in the docs. Hash: 4c03ad2cd9c5934ae7e2bf41f567115b7fb2cd6a Files affected: docs/libstatgrab/Makefile.am docs/saidar/Makefile.am docs/statgrab/Makefile.am 2008-05-24 Adam Sampson Disable autoconf maintainer mode -- it's less broken in modern autoconf, so it's useful now. Hash: 71bc57980c403f4645fc46d1554d1184976811c0 Files affected: configure.in 2008-03-17 Tim Bishop Post release version increment. Hash: fa68b2785208dc326ee8ccc4257a44aef9e86ac4 Files affected: configure.in 2008-03-13 Tim Bishop Add NEWS entry for 0.16 release. Hash: cbdb7602b13bc13dbac8898bb861ef3ed5c74c3e Files affected: NEWS 2008-03-13 Tim Bishop Fix mrtg config generation on machines with no swap. Patch by: Tom Carlson Hash: acc7cc59339d0f02964a9d8b7d8a4fc84b3ac4a9 Files affected: src/statgrab/statgrab-make-mrtg-config.in 2008-02-16 Tim Bishop saidar uses fabs which requires libm. Hash: 9665c26af5eae1f350ed3fd20312d2ebbdc5fb71 Files affected: configure.in 2007-11-06 Tim Bishop Some GNU/Linux builds have a slightly different name, like linux-gnueabi. See Debian bug Bug#449586 for details. Hash: cc06585292b53174195e2092810cd7f32de45530 Files affected: configure.in 2007-10-21 Tim Bishop FreeBSD's main development line is now at 8. Hash: dbc86028d0c0c069e6b10f7ab39b54bc9de9c55d Files affected: configure.in 2007-07-13 Tim Bishop Post-release version increment. Hash: c39b975fc2758e8be817a52d68245b355e6eb356 Files affected: configure.in 2007-07-13 Tim Bishop Bump library revision for 0.15 release. Hash: 20c984e4b971003d9da5f5a7b8d63977a975c8f7 Files affected: src/libstatgrab/Makefile.am 2007-07-13 Tim Bishop Update for 0.15 release. Hash: 6d12a57307a3549ecdee7196d664669c391fd654 Files affected: NEWS 2007-07-05 Tim Bishop Last argument to sysctl is an integer not a pointer. It should be set to 0 if the preceding argument is NULL. Hash: 00521c6c21905cfe757a92080b7422b7488c1575 Files affected: src/libstatgrab/swap_stats.c 2007-06-18 Tim Bishop Update strlcat and strlcpy to latest OpenBSD versions. Remove last references to strcat and strcpy. Patch submitted by: David Love Hash: f8c0258b021909da257ad68068f2e8fb5446e8a1 Files affected: src/libstatgrab/tools.c 2007-06-18 Tim Bishop Fix memory stats on OpenBSD - they were returning results in the wrong units. Patch submitted by: David Love Hash: fa3d92ab9c0bc06604347347aa98e6c7672368ad Files affected: src/libstatgrab/memory_stats.c 2007-01-06 Tim Bishop Fix bug in curses detection - LIBS was not properly reset. Also remove to redundant variable declarations. Hash: ced3ff7f2179f52c6a2cbb745039258d4aa339a8 Files affected: acinclude.m4 2007-01-05 Tim Bishop Post-release version increment. Hash: 27f7e972a9975658b0774762a4e0b457a8ebac7b Files affected: configure.in 2007-01-05 Tim Bishop Add note about saidar bugfix, and set a release date. Hash: e9c69f732ae42ed1b1ab2369229934e05918526b Files affected: NEWS 2007-01-05 Tim Bishop Fix problem with saidar crashing when window is rapidly resized. Done by moving the code out of the signal handler and in to the main loop, and just having a global flag set by the signal handler. Hash: 3846294c0993c7242ee45eed5a491aa317d545ce Files affected: src/saidar/saidar.c 2006-12-17 Tim Bishop Hide cursor when possible. Hash: 3db666d188ed36303c00845c280fca8ac88392f3 Files affected: src/saidar/saidar.c 2006-12-01 Tim Bishop Sort out curses detection. It'll now detect ncurses before curses, and cope with the header files being in include or include/ncurses. I think this will work in every case. Hash: 56763996e104e45db64d980bfddc985813cf09e7 Files affected: NEWS acinclude.m4 configure.in src/saidar/saidar.c 2006-12-01 Tim Bishop Colour is only supported if ncurses is being used. Hash: 4703501c2a3ccacdb37d6b3d3443cc3723854f5f Files affected: src/saidar/saidar.c 2006-12-01 Tim Bishop Standout doesn't work on all displays, so use bold too. Hash: 2da1bf6d5735d403834f3f7af0f29e874f196aae Files affected: src/saidar/saidar.c 2006-12-01 Tim Bishop Bump library version for 0.14. Hash: b10b439ed5957e4882879905d9ace0e8241174ac Files affected: src/libstatgrab/Makefile.am 2006-12-01 Tim Bishop Provisional NEWS entry. Hash: 7ef91a387788befcdb40e29b248133f2a364d1b9 Files affected: NEWS 2006-11-30 Tim Bishop Add support for coloured fields in saidar. Optionally enabled by using the new -c flag. Manpage updated with details. Mostly taken from a patch supplied by Angelina Carlton , but I made minor changes to layout and function. Hash: c393156b674f0ad26c30345552bd36d828a9796e Files affected: docs/saidar/saidar.xml src/saidar/saidar.c 2006-11-30 Tim Bishop Whitespace cleanup. Hash: fcc1eafc7fbe0c390721c7e910248faf4d1a4c92 Files affected: src/saidar/saidar.c 2006-10-30 Tim Bishop Fix compile problem in last commit. Hash: c8baa874c8cf01dc21ccd440b43d9fd1ef8231d4 Files affected: src/libstatgrab/memory_stats.c 2006-10-29 Tim Bishop Fix memory stats on OpenBSD. Currently untested. Submitted by: bsd@openbsd.rutgers.edu Hash: 6b55a52d2e108e15f26dd16ec2dcf87925221e09 Files affected: src/libstatgrab/memory_stats.c 2006-10-09 Tim Bishop When checking the interface up status check the link status as well. Suggested by: "Vassallo, Michelangelo (Michelangelo)" Hash: 49bc607420d5ace0c49155c32c43b74224ab839f Files affected: src/libstatgrab/network_stats.c 2006-10-09 Tim Bishop Move reading the interface name to earlier in the function. This fixes problems for us on a host with slightly peculiar interfaces. Hash: 1eaec37b6a964847045de5d1541858fac6ac65a1 Files affected: src/libstatgrab/network_stats.c 2006-10-09 Tim Bishop Fix process time_spent on Linux. Spotted by: Fred Barnes Hash: 69f57af1b3b38fc6c2128a0ab9268adbce59b60f Files affected: src/libstatgrab/process_stats.c 2006-10-09 Tim Bishop Make sure we always close kstat. Spotted by: "Javier Donaire" (in load_stats.c) Hash: 5d1fbcf20eb4537b84505025e76472931a0ca326 Files affected: src/libstatgrab/disk_stats.c src/libstatgrab/load_stats.c src/libstatgrab/network_stats.c src/libstatgrab/os_info.c src/libstatgrab/tools.c 2006-10-09 Tim Bishop Attempt to fix cpu stats on solaris. It seems iowait covers all the various types of wait, including IO and swap. So instead we do: iowait = cs.cpu_sysinfo.wait[W_IO] + cs.cpu_sysinfo.wait[W_PIO] swap = cs.cpu_sysinfo.wait[W_SWAP] I'm also not sure if cs.cpu_sysinfo.cpu[CPU_STATES] means anything. Hash: caf475b759fc2f77b13b6054d1cbb26c8ac9fd56 Files affected: src/libstatgrab/cpu_stats.c 2006-04-24 Tim Bishop Allow to build on NetBSD 3. Submitted by: Wijnand Wiersma Hash: da4bc9dcf6ac7ff8cc725646bc59b31ad636be54 Files affected: configure.in 2006-03-18 Tim Bishop Post-release version increment. Hash: 1aea7eea8b052ee67903dd9b605bc05e71ca8bbd Files affected: configure.in 2006-03-18 Tim Bishop Modify shared library version appropriately, I think. Hash: 82eecd0c49e2e8bd863a446f5bc498959c5226f9 Files affected: src/libstatgrab/Makefile.am 2006-03-17 Tim Bishop Add latest changes to NEWS file. Hash: 4947f926fa33b8ba45c4d7437e63fae8c9b6c2a1 Files affected: NEWS 2006-03-17 Adam Sampson Have nfs be a legal filesystem type on all platforms. Hash: 1e75ba6211ef53f718ea24524bfb6264ab3c4dbe Files affected: src/libstatgrab/disk_stats.c 2006-03-17 Adam Sampson Replace both spaces and dots with underscores in name components, so that filesystem paths containing dots work correctly. Hash: 9313f652715f1ac81865f8675439702d17902025 Files affected: src/statgrab/statgrab.c 2006-03-11 Tim Bishop Provisional NEWS entry. Hash: 1103d2f073b698494663eab3b18ab72ff07ee543 Files affected: NEWS 2006-03-11 Tim Bishop Nasty hack to make inclusion in C++ code easier. We seem to be getting regular reports of problems with C++, and this should fix them. Hash: 51cad204927960e713805f783ebb83599c24f4a9 Files affected: src/libstatgrab/statgrab.h 2006-03-02 Tim Bishop Add AM_MAINTAINER_MODE. Hash: f485674dfe14e371530b2b2d0263603860e9360e Files affected: configure.in 2006-02-18 Tim Bishop Apply fix to Win32 code. Patch by: "Tim Teulings" Hash: dd346e384a93d5c445d4078579889b15f30527d9 Files affected: src/libstatgrab/win32.c 2006-01-22 Tim Bishop Fix bug on Solaris; network interfaces always seem to be up. Reported by: joanmoraleda@ono.com Hash: 8f78fa32eaa755caa32631671757f5f8ce937253 Files affected: src/libstatgrab/network_stats.c 2005-11-11 Tim Bishop If configure options used not to install tools then don't install manpages for them either. Noticed by looking at NetBSD pkg :-) Hash: 5fa54041fd8d2f1e67a3f905f5b0637d319698c4 Files affected: docs/saidar/Makefile.am docs/statgrab/Makefile.am 2005-09-24 Tim Bishop Add WIN32 support via MINGW. We'll need to add stuff to the README file about what this requires to build. All the hard work done by: skel Hash: ff401956bc615edea6e1fb1e222edaf99a88c4b7 Files affected: configure.in examples/cpu_usage.c src/libstatgrab/Makefile.am src/libstatgrab/cpu_stats.c src/libstatgrab/disk_stats.c src/libstatgrab/error.c src/libstatgrab/load_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/network_stats.c src/libstatgrab/os_info.c src/libstatgrab/page_stats.c src/libstatgrab/process_stats.c src/libstatgrab/statgrab.h src/libstatgrab/swap_stats.c src/libstatgrab/tools.c src/libstatgrab/tools.h src/libstatgrab/user_stats.c src/libstatgrab/win32.c src/libstatgrab/win32.h src/statgrab/statgrab.c 2005-09-07 Tim Bishop Simple hack to truncate disk/interface/mount names to fit in to the field. Before this they just overwrote stuff and it got messy. Hardly an elegant fix, btw ;) Hash: ad97997f6ae1fc6396579641c63731b4ce550ec7 Files affected: src/saidar/saidar.c 2005-07-30 Adam Sampson Use to define __u32 etc., and always define u32 etc. because the Debian 2.6.0-test9 headers still use them in ethtool.h. Hash: 0075a5a83881a42d51ee2e3e331245eb41ad1404 Files affected: src/libstatgrab/network_stats.c 2005-07-30 Tim Bishop Post-release version increment. Hash: 4d71e2f2b695d66ef7cd604d0dd8546bb5e5bcdd Files affected: configure.in 2005-07-30 Tim Bishop Put in the date for the 0.12 release. Hash: 8b9ab433a2768d4b96a87dc9c1600f45f2a5ffe9 Files affected: NEWS 2005-07-18 Adam Sampson Fix a typo. Hash: b43a7ba231d89407a42a1cb86c1a889ee67b315e Files affected: NEWS 2005-07-18 Tim Bishop Prepare for 0.12 release. Hash: d1611f47eda23b8508f24319486ccb52959270fb Files affected: NEWS src/libstatgrab/Makefile.am 2005-07-13 Tim Bishop Add support for FreeBSD 7 (which is exactly like 6 at the moment, so it's bound to work :) Hash: 0699772b770027ed966e90412445b745d3c61a83 Files affected: configure.in 2005-07-13 Tim Bishop Add more fs stats. Patches provided by: Roman Neuhauser Hash: 4bd3cbc12c90f125fbee40314c5f7ff7de54a940 Files affected: docs/libstatgrab/sg_get_fs_stats.xml src/libstatgrab/disk_stats.c src/libstatgrab/statgrab.h src/statgrab/statgrab.c 2005-07-13 Tim Bishop Change the name of the duplex value from "dup" to "duplex". This will break the ABI, but we're changing the fs stats anyway. The API change is minimal, so hopefully won't affect too many people. Hash: 3d3cf605620c27a64f06a4406f09e0c07ddb7824 Files affected: docs/libstatgrab/sg_get_network_iface_stats.xml examples/network_iface_stats.c src/libstatgrab/network_stats.c src/libstatgrab/statgrab.h src/statgrab/statgrab.c 2005-04-26 Tim Bishop Bit more detail about saidar. Hash: 42024c1b8b4607ef8f39a829e496b4929e9e8330 Files affected: docs/saidar/saidar.xml 2005-04-25 Tim Bishop Apply patch from Scott Lampert to make the network ethtool bits compile on Linux 2.6. Hash: 774c1cd98c2e2788a72b3c8581c4891e40d2cc8b Files affected: src/libstatgrab/network_stats.c 2005-04-25 Tim Bishop Add manpages for the various tools. Hash: e2de012878943d398ce2ea29cfd01508411ee89a Files affected: configure.in docs/Makefile.am docs/libstatgrab/Makefile.am docs/saidar/Makefile.am docs/saidar/saidar.xml docs/statgrab/Makefile.am docs/statgrab/statgrab-make-mrtg-config.xml docs/statgrab/statgrab-make-mrtg-index.xml docs/statgrab/statgrab.xml 2005-04-25 Tim Bishop Fix consistency problem in usage output. Hash: 71ace6085b9cf459d158bfb0bec5de765b34e404 Files affected: src/statgrab/statgrab.c 2005-04-25 Tim Bishop Move by repocopy the libstatgrab docs in to a subdirectory. This is so I can create separate directories for statgrab/saidar docs. Hash: 545afc1a9367712df24138844089c8410ba6ba47 Files affected: docs/sg_get_cpu_stats.xml docs/sg_get_disk_io_stats.xml docs/sg_get_fs_stats.xml docs/sg_get_host_info.xml docs/sg_get_load_stats.xml docs/sg_get_mem_stats.xml docs/sg_get_network_iface_stats.xml docs/sg_get_network_io_stats.xml docs/sg_get_page_stats.xml docs/sg_get_process_stats.xml docs/sg_get_user_stats.xml docs/statgrab.xml 2005-04-25 Tim Bishop Nuke sgps - Pete's decided it's actually rather pointless as it doesn't offer anything that other ps programs don't. Hash: 974258b83900952613c73ca5116a739d97bcc496 Files affected: configure.in src/Makefile.am src/sgps/Makefile.am src/sgps/sgps.c 2005-04-25 Tim Bishop Update list of platforms - we've tested on Solaris 10. Hash: e0c4104a0676143a11ad537c0fa51ef2001f014a Files affected: PLATFORMS 2005-04-13 Adam Sampson Rework Linux partition detection to detect devices called "c0d0" (etc.) and not assume they're partitions -- the DAC* and Compaq RAID devices do this. Hash: 7eb74cf671ba032f9fb785acccb2f11be66cf72c Files affected: src/libstatgrab/disk_stats.c 2005-04-07 Peter Saunders Added support for user and added usage. Also made headers go on stderr, so if going thru some parsing script, it doesn't need to strip off the first line. Hash: ea7821dff425a2974969cc226519344859c8c44f Files affected: src/sgps/sgps.c 2005-04-04 Tim Bishop Add build bits for sgps. Hash: 0ccbed2414d865ce0355304536b125ccad0832fe Files affected: configure.in src/Makefile.am src/sgps/Makefile.am 2005-04-04 Peter Saunders Initial version. Only compiled on solaris - but seems to work. Makes use of efA flags, and also a 'o' flag for sorting.. ps -o cpu ps -o mem will sort by that type. Need to do the -n flag still (not look up names - although, is there much point to that?) Hash: 19bd2f09d13a321fa83d7a2b1b24eca50b345022 Files affected: src/sgps/sgps.c 2005-03-01 Tim Bishop Post release version increment. Hash: ccc08f554af0acf670aeeb6661b00f9dde6e6f06 Files affected: configure.in 2005-03-01 Tim Bishop Update for new release. Hash: 5622e1c439d11174786a0dd685e9774accd94334 Files affected: src/libstatgrab/Makefile.am 2005-03-01 Tim Bishop Prepare NEWS for new release. Hash: 751ecc0e8bcefa894d046f60aee8cfe4cf3c38f6 Files affected: NEWS 2005-02-24 Tim Bishop The labels in this case statement were the wrong way round, so the duplex settings were being reported incorrectly on linux. Use the defines instead of the values so we can be sure they're right. Spotted by Pete. Hash: 231fce82c1231554aa068747a3d1bff0d2d0db3d Files affected: src/libstatgrab/network_stats.c 2005-02-24 Tim Bishop Add NFS to list of file systems that we return information for. Hash: 91911540f400d2c6c4e8143c7db6b0ca447fcb0b Files affected: src/libstatgrab/disk_stats.c 2005-01-17 Tim Bishop Make size_conv deal with negative numbers too (it does happen :-). Hash: 93c722b0edbe088e0248ab0a06beb7be7b800758 Files affected: src/saidar/saidar.c 2004-11-08 Tim Bishop Give Roy credit for the work on HP-UX. Hash: a85bc603f33ef393803fbc248a19751c137b973a Files affected: NEWS 2004-11-08 Tim Bishop Post-release version increment. Hash: 5b10c42203ea95105d8f0f4c48752e89b0097b0c Files affected: configure.in 2004-11-08 Tim Bishop Reword NEWS slightly. Hash: a99dfcae9ada9080f614b7aea9e3eadc9be63051 Files affected: NEWS 2004-11-08 Tim Bishop Update NEWS for new release. Hash: c909b9a275eee11748fea2db68d9a473ae30bed0 Files affected: NEWS 2004-11-08 Adam Sampson Raise SG_ERROR_UNSUPPORTED for interface stats on Cygwin and HP-UX. Hash: aac8d545f021d7c872ab4476865af6517cbaf478 Files affected: src/libstatgrab/network_stats.c 2004-11-07 Adam Sampson HP-UX disk IO calculation, version 3. Hash: 833fe5d79a374408caa9857c936b50367dcc9824 Files affected: src/libstatgrab/disk_stats.c 2004-11-07 Adam Sampson Put back the dummy argument -- I know it's not used, but signal handlers have to have it. Hash: b2ff4f170282f5761806bd36bf7042faad6c8e93 Files affected: src/saidar/saidar.c 2004-11-07 Adam Sampson Linux always has atoll, but Cygwin doesn't. Hash: a6caba1d030b9b126f77c333d003c00cfcf0b857 Files affected: src/libstatgrab/tools.c 2004-11-07 Adam Sampson Always include string.h (for strcmp). Hash: cb7504899f715ff8c0df1ef4346b5b5a7e0dd9e6 Files affected: src/libstatgrab/process_stats.c 2004-11-07 Adam Sampson Add tools.h include. Hash: 1ed8d331f0b3dccbe7f0e2f46caf6425acba5e23 Files affected: src/libstatgrab/os_info.c 2004-11-07 Adam Sampson HP-UX can't do network stats. Hash: 2c1649266b8fd1d351ceac27aa7c4fefdc1608f2 Files affected: src/libstatgrab/network_stats.c 2004-11-07 Adam Sampson loadav is only needed on non-HP-UX. Hash: 30c2fc7fed9c60b78abf62ea4f127ebb483a2153 Files affected: src/libstatgrab/load_stats.c 2004-11-06 Tim Bishop Cast numbers to be the same type when doing a comparison. Hash: 32246e4a448117673b9beb29e0576654715a3c73 Files affected: src/libstatgrab/disk_stats.c src/libstatgrab/process_stats.c src/libstatgrab/tools.c 2004-11-06 Tim Bishop atoll is only used in one place in libstatgrab, so move it's definition to before that one use. Given this hasn't caused us problems I'm guessing that atoll is actually available on Linux and Cygwin, which would make having the function here void. If so, it can simply be removed instead. Hash: 24904a372d766ee11f1dc31191ffe1c7b7872a98 Files affected: src/libstatgrab/tools.c 2004-11-06 Tim Bishop Remove another unused parameter. Hash: 865ad8982037cbb0023bd6a66fa68028286d68d1 Files affected: src/saidar/saidar.c 2004-11-06 Tim Bishop Remove a couple of unused parameters. Hash: 7c4f9b8ed07c5d4fe51937008de1f11a5f095d03 Files affected: examples/os_info.c examples/vm_stats.c 2004-11-06 Adam Sampson Rework the HP-UX swap stats code to fetch batches of swap devices. (Untested.) Hash: 299c900bb2610a4f380b7632d9331728e287b1c3 Files affected: src/libstatgrab/swap_stats.c 2004-11-06 Adam Sampson Add a FIXME (it'd be preferable to avoid the /dev/dsk search when possible). Hash: 6f92c93c76a591eee01ecd22c230eadf8900d02e Files affected: src/libstatgrab/disk_stats.c 2004-11-06 Adam Sampson Fix IO bytes calculation -- the value returned is in 16-bit words, so divide by two to get bytes. Hash: 00192a0628b8fe3d6f6560496f8ff49aa4985af1 Files affected: src/libstatgrab/disk_stats.c 2004-11-06 Adam Sampson Rework the HP-UX disk stats code to fetch batches of disks. (Untested.) Hash: 9efb37610bce8d10f4688b90cc1446ae6c4af889 Files affected: src/libstatgrab/disk_stats.c 2004-11-06 Adam Sampson Oops -- make the loop work. (Untested.) Hash: 5a9dbad39003418055c784dddf600f2d40e7be95 Files affected: src/libstatgrab/process_stats.c 2004-11-06 Adam Sampson Rework the HP-UX process stats code to fetch batches of processes in fewer system calls. (Untested.) Hash: c55ebe06c48e4d3ef30c94a7075561087262de6f Files affected: src/libstatgrab/process_stats.c 2004-11-06 Adam Sampson Add sg_get_pstat_static for HP-UX. (Untested.) Hash: 1792201bc0af8cab104ce1f665bc7dc0dab9ae30 Files affected: src/libstatgrab/memory_stats.c src/libstatgrab/os_info.c src/libstatgrab/tools.c src/libstatgrab/tools.h 2004-11-01 Adam Sampson Correct comment. Hash: e0c516acd87c3f6cbe2445855dbc0617f925dd25 Files affected: src/libstatgrab/disk_stats.c 2004-11-01 Adam Sampson We don't need the realloc workaround -- we don't rely on the GNU behaviour. Hash: 3eb6e4903bcf30deba7bd2dbfb29386e67f91c06 Files affected: configure.in src/libstatgrab/tools.c 2004-11-01 Tim Bishop Lets not forget the documentation. Hash: f93b1a51994c3d3fa916a71ce4ac48c869cddf51 Files affected: docs/libstatgrab/statgrab.xml docs/statgrab.xml 2004-11-01 Tim Bishop Next release will be 0.11. Hash: 452f5bdc02b5bdd9369c70a3d6e06713d076ef4c Files affected: configure.in src/libstatgrab/Makefile.am 2004-11-01 Tim Bishop Merge in patch to provide support for HP-UX 11.11. Contributed by Roy Keene - thanks Roy! Hash: e11976bb874abbba2f36466ecb62776413cf91f3 Files affected: PLATFORMS configure.in src/libstatgrab/cpu_stats.c src/libstatgrab/disk_stats.c src/libstatgrab/error.c src/libstatgrab/load_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/os_info.c src/libstatgrab/process_stats.c src/libstatgrab/statgrab.h src/libstatgrab/swap_stats.c src/libstatgrab/tools.c src/libstatgrab/user_stats.c 2004-10-23 Adam Sampson The maximum value must be an integer. Hash: a4e1c50c3cbee5e48e8f724cd92c5ecb629bc4ee Files affected: src/statgrab/statgrab-make-mrtg-config.in 2004-10-11 Tim Bishop Fix when used percentage hits 100%. Hash: 9f18e3c34a0213442c95570adf17dc9c2ed0b1db Files affected: src/saidar/saidar.c 2004-09-10 Adam Sampson Fix some nasty repeated if()s (reported by Fred Barnes). Hash: 899f7a3b094a5cfb6f9fefc3ebbf31718ac844ab Files affected: src/libstatgrab/process_stats.c 2004-08-24 Tim Bishop Post release version increment. Hash: c67f007f4687a749ab349d5ccfc3670e8abca314 Files affected: configure.in 2004-08-24 Tim Bishop Add mention of FreeBSD 6.0 -CURRENT support. Hash: d772f1a5a6c5c91b42456235e550983aa2450985 Files affected: NEWS 2004-08-24 Tim Bishop Add support for FreeBSD 6.0. Drop version back to get this into the new release. Hash: 141b2f6d1f83487ae08ab0413df5f1f74e7dce23 Files affected: configure.in 2004-08-23 Tim Bishop Post release version increment. Hash: 871358f0d61ac42fc5529ad1b480342da8ceb0f1 Files affected: configure.in 2004-08-23 Adam Sampson Fix logic error: maximum network speeds should be KiB, not Mbit. Hash: 3e374e9768d4529b1f8abe783d1264d6a47e3551 Files affected: src/statgrab/statgrab-make-mrtg-config.in 2004-08-23 Adam Sampson Update NEWS for statgrab changes. Hash: 3a2f5fbd1d31ec484ea3ab0238211bb8a52cec58 Files affected: NEWS 2004-08-10 Adam Sampson Repair whitespace damage in help message. (It's still there in the other code.) Hash: 1ef3c7bfd9a1ada1a4491e0fa3238f26c28eb118 Files affected: src/statgrab/statgrab.c 2004-08-10 Adam Sampson "Mebibyte", not "mibibyte". Hash: 34900755624e650b630e2742e3503c9bb3d50f0d Files affected: src/statgrab/statgrab.c 2004-08-10 Adam Sampson We do know the interface speed these days, so we don't (always) have to guess. Hash: dd6913d3b0407f15088c0784dfbedae8d12f58a9 Files affected: src/statgrab/statgrab-make-mrtg-config.in 2004-08-10 Adam Sampson Use -K and -f to produce better MRTG output. Hash: ee5981152ec39e641f01463ba23238fb84d103a4 Files affected: src/statgrab/statgrab-make-mrtg-config.in 2004-08-10 Adam Sampson Add -K, -M and -G to display byte counts in kibibytes, mibibytes and gibibytes (mostly for MRTG use, since it can't deal with numbers bigger than 32 bits). Hash: 4ea841d876ba45648400518d0c5ef5978cd7029e Files affected: src/statgrab/statgrab.c 2004-08-10 Adam Sampson Add -f option to scale floating-point values to integers for MRTG output. Hash: fcfc251e8f0a80ba308fa46583eb2b7f9a62d645 Files affected: src/statgrab/statgrab.c 2004-07-27 Tim Bishop Post release version increment. Hash: 9ed36c69da3565760a8046bf73f511a8962c7936 Files affected: configure.in 2004-07-27 Tim Bishop Fix the shared library version. Hash: b26238bb6e2d836123ab29d6c2f864f4040d2b21 Files affected: NEWS src/libstatgrab/Makefile.am 2004-07-25 Tim Bishop Fix release date. Hash: 7c13a73f201412273e5389c7e7a2deb70426459d Files affected: NEWS 2004-07-18 Adam Sampson getpagesize() cannot fail. Hash: 5e68cdb56d16f1e304ab052dfd6f0873b374e244 Files affected: src/libstatgrab/memory_stats.c 2004-07-18 Adam Sampson Use sg_set_error_with_errno whenever errno's valid. Change the one user of SG_ERROR_ENOENT to SG_ERROR_SYSCTL instead (since that's what it should have been). Hash: c9306f8f499ddbab2df1dc8795d060b46dbd1723 Files affected: src/libstatgrab/cpu_stats.c src/libstatgrab/disk_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/network_stats.c src/libstatgrab/os_info.c src/libstatgrab/page_stats.c src/libstatgrab/process_stats.c src/libstatgrab/swap_stats.c src/libstatgrab/tools.c src/libstatgrab/user_stats.c 2004-07-18 Adam Sampson Document sg_get_error_errno. Note that sg_get_error_arg can return NULL. Hash: f2061c795e0c837e4d793904944d694409ee7b61 Files affected: docs/libstatgrab/statgrab.xml docs/statgrab.xml 2004-07-18 Adam Sampson Remove extraneous consts. Hash: 244967ce941c501d53320ef001d3303f365d88e0 Files affected: src/libstatgrab/error.c src/libstatgrab/statgrab.h 2004-07-18 Adam Sampson Clear errno_value on errors that don't have a valid errno. Hash: 579b0576118804e8beabaf2791185450908ee9f6 Files affected: src/libstatgrab/error.c 2004-07-18 Adam Sampson Fix a couple of typos. Hash: 80cafcaa673eed0caf249b3b300106e1ddf076e7 Files affected: NEWS 2004-07-18 Tim Bishop Post-release version increment. Hash: dc207c64e4f03c8653468c2a8f42b899fd95e919 Files affected: configure.in 2004-07-18 Tim Bishop Catch a few bits of documentation/comments containing the deprecated function names. Hash: 021c2bc0791565c3b8cad6cb6e64bc1a697d9d5b Files affected: PLATFORMS docs/libstatgrab/sg_get_disk_io_stats.xml docs/sg_get_disk_io_stats.xml src/statgrab/statgrab.c 2004-07-18 Tim Bishop Update NEWS and library version for next release. Hash: 9196d1425bc847b933f684b3395ab2d7013547ed Files affected: NEWS src/libstatgrab/Makefile.am 2004-07-16 Tim Bishop Do the errno capturing in a nicer way. Hash: 74cfc44efabd6700c23dcb8144c24fdb3131ef85 Files affected: src/libstatgrab/error.c src/libstatgrab/statgrab.h src/libstatgrab/tools.c 2004-07-16 Tim Bishop Add function to allow grabbing of the current errno. Should we store errno too maybe? Hash: 4bb6787deabf20ab9691a6e9c43354adaecffc4b Files affected: src/libstatgrab/error.c src/libstatgrab/statgrab.h src/libstatgrab/tools.c 2004-07-16 Adam Sampson Make sure that network interfaces get an interface_name stat, even if they don't have IO stats (like for loopback interfaces on Solaris). Hash: ffc36810237a293908b4d9fa5b2481ed4d514b03 Files affected: src/statgrab/statgrab.c 2004-07-02 Tim Bishop Make sure statgrab.h can't be included twice. Hash: f6ffcca1d39a3c197c1c66f1230ea4acf0d4e5dd Files affected: src/libstatgrab/statgrab.h 2004-06-21 Tim Bishop Add three variables to the pkg-config file: bin_owner, bin_group, bin_perm The purpose of these variables is to suggest the required owner, group and permissions that might be used to make a binary using libstatgrab work fully. I'm not sure if this is the "best" way of doing this, but it seems like a reasonable idea. Hash: e638f3d0559d62671a7f6d2476c359251260cdff Files affected: configure.in libstatgrab.pc.in 2004-06-21 Tim Bishop Let libstatgrab know about the veritas file system (vxfs). Hash: a1fe2057497d1d29e175574db066791639fe99be Files affected: src/libstatgrab/disk_stats.c 2004-06-21 Tim Bishop Fix memory leak on NetBSD 2.0. (kl_stats wasn't being free'd) Hash: c40d11b62ba0832983fd3cd8f2d0c5cd13f899db Files affected: src/libstatgrab/process_stats.c 2004-06-20 Tim Bishop On NetBSD 2.0 (in fact, all BSD's, but only know of NetBSD 2.0) use statvfs instead of statfs when available. No guarantees I've got this right - I need to upgrade our NetBSD 2 test machine to a more recent build. Hash: a2615d6590dc8a381ad92320fe5105f60fb9a863 Files affected: configure.in src/libstatgrab/disk_stats.c 2004-06-20 Tim Bishop Since OpenBSD 3.5 disk io stats have been seperated into read and write, just like NetBSD. This fixes libstatgrab to work on 3.5+. Bug reported by Wijnand Wiersma and Christian Weisgerber. Hash: 19c7f1dbbe62dc22b150f17a4e2b4ca4ed984a34 Files affected: configure.in src/libstatgrab/disk_stats.c 2004-06-18 Tim Bishop Fix permission setting when DESTDIR is used. There still seems to be an issue with libtool on my FreeBSD box, but a google search suggests this is fixed in later versions of libtool. Thanks to Daniel for this one. Hash: 2a42457fbfbea708d924b75f185b8dd81cb61ef2 Files affected: src/saidar/Makefile.am src/statgrab/Makefile.am 2004-05-30 Adam Sampson Clear the error buffer on startup. Hash: 63f6f9c0c7f679b40d40b0bcc83aa128cebf2c6d Files affected: src/libstatgrab/tools.c 2004-05-19 Tim Bishop Post-release increment. Hash: e7954000786b08539e10926e0481d3edd6a10210 Files affected: configure.in 2004-05-19 Tim Bishop Update NEWS file for 0.10 release. Hash: b7daaeea8be5ecd8e08ccb3af8956916dfc7a6ff Files affected: NEWS src/libstatgrab/Makefile.am 2004-05-18 Peter Saunders Added details about the supplied sorting functions that can be passed to qsort Hash: 9ec11958b00872ea3f2ff1758478a5b1b7207976 Files affected: docs/libstatgrab/sg_get_process_stats.xml docs/sg_get_process_stats.xml 2004-05-08 Tim Bishop Eek. I commited XML that didn't parse! Hash: a9e6673c123aa06648ad37862ae616bb1f2f2b03 Files affected: docs/libstatgrab/sg_get_fs_stats.xml docs/sg_get_fs_stats.xml 2004-05-08 Tim Bishop Reword some bits about the entries parameter. Hash: 5680b380231d82ce6b21025238c8de7463af4ac3 Files affected: docs/libstatgrab/sg_get_fs_stats.xml docs/libstatgrab/sg_get_process_stats.xml docs/sg_get_fs_stats.xml docs/sg_get_process_stats.xml 2004-05-05 Tim Bishop And add sg_get_fs_stats properly :-) Hash: 7780143040ba08cd2babd23ee4adb242173192fd Files affected: docs/libstatgrab/statgrab.xml docs/statgrab.xml 2004-05-05 Tim Bishop Add sg_get_fs_stats to statgrab.xml. Hash: a5821edb9f088a177ca48f7e21158791f3498b38 Files affected: docs/libstatgrab/statgrab.xml docs/statgrab.xml 2004-05-05 Tim Bishop Add docs for sg_get_fs_stats. Hash: 7bc91f28c4f6e90ab29a61a850197c78199a9481 Files affected: docs/Makefile.am docs/libstatgrab/sg_get_fs_stats.xml docs/sg_get_fs_stats.xml 2004-05-04 Tim Bishop Document the new process stats code a bit, and the error reporting code. No mention of the sorting stuff, because I'm not sure how that works. That's it for new stuff - assuming I haven't missed anything. Hash: b0fd9f01b870748668627b2a9ff03ddccc0ac031 Files affected: docs/Makefile.am docs/libstatgrab/sg_get_process_stats.xml docs/libstatgrab/statgrab.xml docs/sg_get_process_stats.xml docs/statgrab.xml 2004-05-02 Tim Bishop Another pass, finish off the main page and fix a few problems. Still to document: process stats (new stuff), error stuff, and some fs related stuff. Hash: 06bfc4062406fe026ddc6552a72766b24e45658f Files affected: docs/Makefile.am docs/libstatgrab/sg_get_cpu_stats.xml docs/libstatgrab/sg_get_process_stats.xml docs/libstatgrab/statgrab.xml docs/sg_get_cpu_stats.xml docs/sg_get_process_stats.xml docs/statgrab.xml 2004-05-02 Tim Bishop First pass as updating contents of documentation. Hash: 130f282dcb4e9e1cec31918162a3e16f3f9578fa Files affected: docs/Makefile.am docs/libstatgrab/sg_get_cpu_stats.xml docs/libstatgrab/sg_get_disk_io_stats.xml docs/libstatgrab/sg_get_host_info.xml docs/libstatgrab/sg_get_load_stats.xml docs/libstatgrab/sg_get_mem_stats.xml docs/libstatgrab/sg_get_network_iface_stats.xml docs/libstatgrab/sg_get_network_io_stats.xml docs/libstatgrab/sg_get_page_stats.xml docs/libstatgrab/sg_get_process_stats.xml docs/libstatgrab/sg_get_user_stats.xml docs/sg_get_cpu_stats.xml docs/sg_get_disk_io_stats.xml docs/sg_get_host_info.xml docs/sg_get_load_stats.xml docs/sg_get_mem_stats.xml docs/sg_get_network_iface_stats.xml docs/sg_get_network_io_stats.xml docs/sg_get_page_stats.xml docs/sg_get_process_stats.xml docs/sg_get_user_stats.xml 2004-05-02 Tim Bishop Do a repo copy of the documentation to their new names, then delete the old ones. They still need their content updating though. We also need docs for the new process stats stuff, the error reporting code, and I think the FS stats which seem to be missing. Hash: bbfb532761e753c52c12d827f37747532838351d Files affected: docs/cpu_percent_usage.xml docs/get_diskio_stats.xml docs/get_general_stats.xml docs/get_load_stats.xml docs/get_memory_stats.xml docs/get_network_iface_stats.xml docs/get_network_stats.xml docs/get_page_stats.xml docs/get_process_stats.xml docs/get_user_stats.xml 2004-04-08 Adam Sampson Skip over argv pointers on OpenBSD. Hash: 00fa4238e533e5cc415cd4cbb7e1aefe4670f4a2 Files affected: src/libstatgrab/process_stats.c 2004-04-08 Tim Bishop Attempt to rework the command line argument fetching - mallocing 256Kb was a bit on the large side. Now we start with something sensible and make it bigger as required. This produces odd results on OpenBSD. Hash: 5cf639964ed290feeb1b22850d7e9193a9ffd6ea Files affected: src/libstatgrab/process_stats.c 2004-04-08 Tim Bishop Fix bugs in error code. Hash: 31ed19a196c764522015d3f410ffc823511f5baa Files affected: src/libstatgrab/disk_stats.c 2004-04-08 Adam Sampson Add comparison functions for names where that's likely to be useful. Make the network_iface_stats example show how to use bsearch to find an interface by name. Hash: 1a1b5a1b965041117f1004be8f6678c1cd2930e7 Files affected: examples/network_iface_stats.c src/libstatgrab/disk_stats.c src/libstatgrab/network_stats.c src/libstatgrab/process_stats.c src/libstatgrab/statgrab.h 2004-04-08 Adam Sampson Nuke sg_process_sort, and make the process stats example demonstrate how to sort using the compare functions and qsort. Hash: 4a1a8666f6c47a4fc6ce40b528d5b0927f804ecd Files affected: examples/process_snapshot.c src/libstatgrab/process_stats.c src/libstatgrab/statgrab.h 2004-04-08 Tim Bishop s/sg_sort_method/sg_process_sort_method/ Hash: 3a7a2ef409a1a6819561fc92c9c463f31b9277b4 Files affected: src/libstatgrab/process_stats.c src/libstatgrab/statgrab.h 2004-04-08 Peter Saunders Name change for future friendlyness. Hash: 536d3e6afd39f56a02ea5a12f7c6bdf4ef4938c6 Files affected: src/libstatgrab/process_stats.c src/libstatgrab/statgrab.h 2004-04-08 Peter Saunders Added some generic sorting methods for process_stats. Hash: 1be73abbcb871f8a254f1e34b0c14ca7bf4abcf7 Files affected: src/libstatgrab/process_stats.c src/libstatgrab/statgrab.h 2004-04-08 Adam Sampson ... and include tools.h to get the definition of sg_strlcpy. Hash: d7f0d61dd365311ae232a377768c545c70e08761 Files affected: src/libstatgrab/error.c 2004-04-08 Adam Sampson sg_strlcpy, not strlcpy. (I think that bit of code's won the "most errors in a three-line commit" award...) Hash: ae6cdd27bf66305269258ff07f8f6b7259e14b9c Files affected: src/libstatgrab/error.c 2004-04-08 Tim Bishop Shift a bunch of parsing functions to be linux/cygwin only. Prompted by a regex related compile error on FreeBSD (we don't use regex's on FreeBSD). Hash: 50676852563a96dd505e8cb1da12d6d948d79f1c Files affected: src/libstatgrab/network_stats.c src/libstatgrab/tools.c src/libstatgrab/tools.h 2004-04-07 Tim Bishop Bugfix in error setting code - we can't strlcpy a NULL. Test out the error code in an example. Hash: f0c22d1b527eb015c491269fb3fd2b467abcb252 Files affected: examples/vm_stats.c src/libstatgrab/error.c 2004-04-07 Adam Sampson Remove a couple of FIXMEs that have been dealt with. Hash: cc30c6f849e1608c966d4d1203cb70b1cf908840 Files affected: src/libstatgrab/statgrab.h 2004-04-07 Adam Sampson Add sg_get_error_arg. It uses a static buffer for storage rather than sg_update_string because we can't do anything about a malloc failure at that point. Remove the default case in the switch, so GCC will give an "unhandled enum value in switch" warning if we add a new error code without a string. Hash: b1beee81439c1bf945d6002ae2e11fd1e3dbe369 Files affected: src/libstatgrab/error.c src/libstatgrab/statgrab.h 2004-04-07 Tim Bishop The rest of the error handling stuff (except the vector code). I've been extremely unimaginative with the string names in error.c, but they're all in one place so much easier to tidy up. I'm also beginning to wonder if we actually needed an SG_ERROR_SYSTEM_CALL to indicate some call into the system failed - because the majority of our errors are those :-) Still to do, then: - vector code - better string names in error.c - deal with arg string in some way - make use of the error status in statgrab/saidar/examples Hash: a908e912552d5d3f9fb1a9a24167d8a5096d59d7 Files affected: src/libstatgrab/error.c src/libstatgrab/load_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/network_stats.c src/libstatgrab/os_info.c src/libstatgrab/page_stats.c src/libstatgrab/process_stats.c src/libstatgrab/statgrab.h src/libstatgrab/swap_stats.c src/libstatgrab/tools.c src/libstatgrab/user_stats.c 2004-04-07 Tim Bishop Error reporting for disk_stats. Hash: e62aafbfb309491c044821dc23c52d486fd743ed Files affected: src/libstatgrab/disk_stats.c src/libstatgrab/error.c src/libstatgrab/statgrab.h 2004-04-07 Tim Bishop More whitespace tidyup (spaces->tabs). Hash: 2e2d3c60b1761b879798eef3733ec87c30e68a28 Files affected: examples/process_snapshot.c src/saidar/saidar.c src/statgrab/statgrab.c 2004-04-07 Peter Saunders Fixed tools.c change of enum Fixed a FD leak in solaris and added nice value. Hash: 10492acbc9c448edbd66b4660c7b0bf171fd8e7e Files affected: src/libstatgrab/process_stats.c src/libstatgrab/tools.c 2004-04-07 Tim Bishop Whitespace tidyup - change spaces to tabs. Hash: 0a1ca6f679a43a2844a0367eac1d1d473d35d895 Files affected: src/libstatgrab/disk_stats.c src/libstatgrab/load_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/network_stats.c src/libstatgrab/os_info.c src/libstatgrab/page_stats.c src/libstatgrab/process_stats.c src/libstatgrab/tools.c src/libstatgrab/user_stats.c src/libstatgrab/vector.c 2004-04-07 Tim Bishop Add error reporting to cpu_stats. Hash: 489ede889de56cafb1e199ecbd4621ae6bc33bce Files affected: src/libstatgrab/cpu_stats.c src/libstatgrab/error.c src/libstatgrab/statgrab.h 2004-04-07 Peter Saunders More linux code, now does uid/gid. Hash: bdd5d5ea3d1e692b24bfb8e06af16de3c62e9f77 Files affected: src/libstatgrab/process_stats.c 2004-04-07 Adam Sampson Include tools.h to get sg_realloc. Hash: bdd442fe0ceb9d05fd51b7e90febd08d66244b4d Files affected: src/libstatgrab/vector.c 2004-04-07 Adam Sampson Change malloc -> sg_malloc, realloc -> sg_realloc, and rewrite the one calloc call to use sg_malloc. Hash: 62d181edaa7b2e7ad465f7b92d2b0fa54483f6a6 Files affected: src/libstatgrab/disk_stats.c src/libstatgrab/process_stats.c src/libstatgrab/tools.c src/libstatgrab/vector.c 2004-04-07 Adam Sampson Change the last few instances of strdup to use sg_update_string. Hash: ebdd80d8106b057b8f5d40d6fa53290640faa047 Files affected: src/libstatgrab/process_stats.c src/libstatgrab/tools.c 2004-04-07 Tim Bishop Add sg_realloc, and a macro fo sg_malloc. Hash: 02e39fc58f063bfaa82ccb3941de95191f6dfd3c Files affected: src/libstatgrab/error.c src/libstatgrab/statgrab.h src/libstatgrab/tools.c src/libstatgrab/tools.h 2004-04-06 Adam Sampson Add SG_ERROR_NONE. Make sg_str_error return const char *. Hash: 1d7e4fe4244d7d8641e554ad99fa2dd905339613 Files affected: src/libstatgrab/error.c src/libstatgrab/statgrab.h 2004-04-06 Tim Bishop Some very basic startings of error handling stuff. I've not put much thought into this yet, it's basically just the idea we've discussed. Of course, this is the easy task. The hard job is creating a whole list of different errors and using them across libstatgrab :-) Hash: cd4cfaa36d51dea96fdce4fa26aafa1b9624a5e2 Files affected: src/libstatgrab/Makefile.am src/libstatgrab/error.c src/libstatgrab/statgrab.h 2004-04-06 Tim Bishop Fix a couple of includes. Hash: c6c069f42b8833ef87a7653650940adb7a098310 Files affected: src/libstatgrab/process_stats.c src/libstatgrab/statgrab_deprecated.c 2004-04-06 Adam Sampson Consistently return -1 for error. Hash: 740c34612946fae785b6c7646d32d821b672230d Files affected: src/libstatgrab/tools.c 2004-04-06 Adam Sampson NetBSD's sysctl sometimes (repeatably) misreports the size of struct uvmexp. Fortunately, it's a fixed-size structure anyway, so we don't need to dynamically allocate it. We probably should be using struct uvmexp_sysctl anyway, since it's ABI-stable. Hash: b5dd0af6f1e283913fe8459196eabdb8cf553181 Files affected: src/libstatgrab/tools.c 2004-04-06 Tim Bishop Add compatibility code. This provides a working pre-0.10 API for old applications. To use simply change the #include line to: define SG_ENABLE_DEPRECATED include This can be disabled at build time completely using --disable-deprecated. Hash: 99ac0e9eacbbaff3c58c6dea9c6e7e4e91da201d Files affected: configure.in src/libstatgrab/Makefile.am src/libstatgrab/statgrab.h src/libstatgrab/statgrab_deprecated.c src/libstatgrab/statgrab_deprecated.h 2004-04-06 Peter Saunders A bit more of the linux code.. Need to do uid/gid bit still. Also, haven't done nice on solaris yet. Hash: 6615325a8f5e3adb8b298708b02e30d59f36d0b8 Files affected: src/libstatgrab/process_stats.c 2004-04-06 Tim Bishop Add header block. Hash: de3ad684a0726b13c223b363c720214377d45316 Files affected: src/libstatgrab/vector.h 2004-04-06 Tim Bishop Update name of project at the top of all soure files. These files now exist in their own right, rather than as part of the "CMS". Hash: 549fddd68669d462167b65a9e23900f0917b0fec Files affected: examples/cpu_usage.c examples/disk_traffic.c examples/load_stats.c examples/network_iface_stats.c examples/network_traffic.c examples/os_info.c examples/page_stats.c examples/process_snapshot.c examples/process_stats.c examples/user_list.c examples/vm_stats.c src/libstatgrab/cpu_stats.c src/libstatgrab/disk_stats.c src/libstatgrab/load_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/network_stats.c src/libstatgrab/os_info.c src/libstatgrab/page_stats.c src/libstatgrab/process_stats.c src/libstatgrab/statgrab.h src/libstatgrab/swap_stats.c src/libstatgrab/tools.c src/libstatgrab/tools.h src/libstatgrab/user_stats.c src/libstatgrab/vector.c src/saidar/saidar.c src/statgrab/statgrab-make-mrtg-config.in src/statgrab/statgrab-make-mrtg-index.in src/statgrab/statgrab.c 2004-04-06 Tim Bishop Add a note about something that needs fixing. We still have problems getting proctitle on some of the BSD's :-( Hash: da731fbceb09678c6de46782dca2b54fd583c637 Files affected: src/libstatgrab/process_stats.c 2004-04-06 Tim Bishop Add mention of NetBSD 2.0. I'm not sure of the best way to format this.. we have platforms we expect to work, and platforms we know to work. For example, we might not have tested OpenBSD 3.4 but we're pretty sure it works. Hash: c75d5704394571a4b8e02ced8981fdb1334c4722 Files affected: PLATFORMS 2004-04-06 Tim Bishop Fix process stats on NetBSD 2.0 (beta). Also fix the 5-processes-workaround Adam committed yesterday on the rest of the BSD's (not just FreeBSD5). Hash: 957cb1f375354a271ea123a907b99aa7c89895e1 Files affected: configure.in src/libstatgrab/process_stats.c 2004-04-05 Adam Sampson To quote from the FreeBSD kernel source: "/* overestimate by 5 procs */". This is the workaround. Hash: fc22704de055ef73761d35acfc1e10d403a099ac Files affected: src/libstatgrab/process_stats.c 2004-04-05 Adam Sampson Make sg_update_string return an int to indicate success, so that it can be used to set a string to NULL. Make Linux process_stats code set proctitle to NULL if it's empty rather than "". Hash: 82aa974246a83187f94c75c9f651135d60190834 Files affected: src/libstatgrab/disk_stats.c src/libstatgrab/network_stats.c src/libstatgrab/process_stats.c src/libstatgrab/tools.c src/libstatgrab/tools.h 2004-04-05 Tim Bishop Update examples to use new names. I guess some renaming could probably be done here, but at least they all compile again now. Hash: be558daad8430f19ac464f505bdd74ef96bd9bcd Files affected: examples/cpu_usage.c examples/disk_traffic.c examples/load_stats.c examples/network_iface_stats.c examples/network_traffic.c examples/os_info.c examples/page_stats.c examples/process_snapshot.c examples/process_stats.c examples/user_list.c examples/vm_stats.c 2004-04-05 Adam Sampson Rename all the functions, types and enums in the API to be consistent. Types are now of the form "sg_mem_stats"; functions of the form "sg_get_mem_stats"; enums of the form "SG_PROCESS_STATE_RUNNING". (The old get_proc_snapshot follows the usual calling convention now.) Make internal functions static where possible. Rename non-static internal functions to have an sg_ prefix so they don't collide with those from other libraries. In particular, strlcpy and strlcat are now called sg_strlcpy and sg_strlcat and are always included. Fix saidar and statgrab to use the new API. Hash: ce02a5f7377337b0a9553b6cb08944a20b4c2973 Files affected: src/libstatgrab/cpu_stats.c src/libstatgrab/disk_stats.c src/libstatgrab/load_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/network_stats.c src/libstatgrab/os_info.c src/libstatgrab/page_stats.c src/libstatgrab/process_stats.c src/libstatgrab/statgrab.h src/libstatgrab/swap_stats.c src/libstatgrab/tools.c src/libstatgrab/tools.h src/libstatgrab/user_stats.c src/libstatgrab/vector.c src/libstatgrab/vector.h src/saidar/saidar.c src/statgrab/statgrab.c 2004-04-05 Tim Bishop Fixed, and properly tested. Hash: c0103e9fcd99281e4f28239d3257fe3b16b226d9 Files affected: src/libstatgrab/process_stats.c 2004-04-05 Tim Bishop Instead of reallocing on the fly, work out the size of the buffer in advance and then fill it on a second pass. Suggested by Adam. Hash: 7f42d15e605d0489f6bba454acdfb7214696951e Files affected: src/libstatgrab/process_stats.c 2004-04-05 Adam Sampson NULL -> \0, initialise malloced memory to \0, and plug a memory leak. Hash: a34e5866ff2c276ab917148d3230a6718909dae9 Files affected: src/libstatgrab/process_stats.c 2004-04-05 Adam Sampson Use vectors and update_string. (I haven't really touched the BSD code here yet.) Hash: 9921edff2b21e6a7e665097c0608555f9afe83cb Files affected: src/libstatgrab/process_stats.c 2004-04-05 Adam Sampson Kill a memory leak when the mapping already exists. Hash: 4e37c1f8c6da9edf4cb89d6eb742af97d3cc8b23 Files affected: src/libstatgrab/tools.c 2004-04-05 Adam Sampson Add a missing check for vector resize failing. Hash: 4d114cfbc417fc5e4f23c460570cc956840cc4e3 Files affected: src/libstatgrab/user_stats.c 2004-04-05 Adam Sampson Fix the strict-aliasing problem in a clean, sensible way that actually works. As a bonus, we now get a "value computed is not used" warning from GCC if we don't check the return value of VECTOR_RESIZE. (This is dubiously a bonus when it's being resized to 0, but it's not going to hurt to check even then -- we might support destructors failing in the future.) Hash: ab13430f6f21302fbc6149a1eede8b2f163e95d7 Files affected: src/libstatgrab/vector.c src/libstatgrab/vector.h 2004-04-05 Adam Sampson Fix the strict-aliasing warnings. This is even uglier than the previous code, since it pushes a test for a sentinel value into the VECTOR_RESIZE macro. I'm pretty certain that the pointer-to-static-used-as-sentinel is my own invention. I'm not entirely convinced that it's a good idea, but I can't see anything technically wrong with it... Hash: 24e444d73b7127ea32fa625de0714cc440fc9409 Files affected: src/libstatgrab/vector.c src/libstatgrab/vector.h 2004-04-05 Tim Bishop We nearly forgot to make the process stats work on cygwin again :-) Hash: d9d7cb0d4868ac1b82540ce45a09a4aa75aa80ec Files affected: src/libstatgrab/process_stats.c 2004-04-05 Adam Sampson Deal with vectors as char ** rather than void **, so we can do pointer arithmetic without Sun cc complaining. Hash: 899c3015ddcace40f86a824777f46cc2efa72c5a Files affected: src/libstatgrab/vector.c src/libstatgrab/vector.h 2004-04-05 Tim Bishop Fix a couple of warnings on Solaris. Hash: e44ee4b8861bca0488593410d1a534664cc6c956 Files affected: src/libstatgrab/network_stats.c src/libstatgrab/tools.c 2004-04-05 Adam Sampson Use update_string. Hash: 34c77c552b29e5f30a05e52b5ba10c56688dcfbe Files affected: src/libstatgrab/network_stats.c 2004-04-05 Adam Sampson Use update_string throughout. Hash: c960c65057be798b14af3452a11e481edfd37917 Files affected: src/libstatgrab/disk_stats.c 2004-04-05 Adam Sampson Add prototype for get_svr_from_bsd, and make it take and return const char *. Hash: 3eca300abc1778ddc1115c6f82792b4dae78e0e1 Files affected: src/libstatgrab/tools.c src/libstatgrab/tools.h 2004-04-04 Tim Bishop Returning NULL in a function that returns int's is wrong :) Now returns -1 on failure. Also change code that calls us to check for < 0 for failures. Hash: 6aeb1a865534610a24d3210fc0607fac739726e6 Files affected: examples/process_snapshot.c src/libstatgrab/process_stats.c 2004-04-04 Adam Sampson I like copy_string. We should use it EVERYWHERE. Also, the name needed changing. Hash: 80a81b61adae4466f2d98f33cbed41ae6b717f18 Files affected: src/libstatgrab/disk_stats.c src/libstatgrab/tools.c src/libstatgrab/tools.h 2004-04-04 Adam Sampson Fix realloc memory leak. Hash: 6cd0c745b3e65a4acba76a1894f2142b613724d1 Files affected: src/libstatgrab/tools.c 2004-04-04 Adam Sampson Rework user_stats to use vectors, which gets rid of all the MAX_LOGIN_NAME_SIZE stuff too. Hash: c33042a03d8d797f795ec7a4b291b417ce4d43e1 Files affected: src/libstatgrab/user_stats.c 2004-04-04 Tim Bishop Minor bugfixes. Hash: ad7e65730bd94fe5b5bfac7f5b2c3f7007db5bd6 Files affected: src/libstatgrab/process_stats.c 2004-04-04 Adam Sampson Convert another realloc-managed static array to a vector. Hash: 3118b075e21898ec6a8348fa239fa3858eb567da Files affected: src/libstatgrab/disk_stats.c 2004-04-04 Tim Bishop Fix a bunch of silly errors. Hash: c82653511a0b7e53d7a8d5a9bb4c24bee656ae83 Files affected: src/libstatgrab/process_stats.c 2004-04-04 Tim Bishop get_proc_snapshot returns an int, not a pointer. Hash: 26855f2a9ead0e379c34905e7f464cfa892ee150 Files affected: examples/process_snapshot.c 2004-04-04 Adam Sampson Make network_stats use vectors. Hash: 38dbd998adec74832b00ff5ce39f8a42f2ead7ad Files affected: src/libstatgrab/network_stats.c 2004-04-04 Tim Bishop Fix a bunch of warnings on the BSD's. Hash: 2f874f5ced1b8af85c475dfac098b0b493b7a912 Files affected: examples/cpu_usage.c examples/disk_traffic.c examples/load_stats.c examples/network_traffic.c examples/page_stats.c examples/process_snapshot.c examples/process_stats.c examples/user_list.c examples/vm_stats.c src/libstatgrab/process_stats.c src/libstatgrab/tools.c src/libstatgrab/tools.h src/saidar/saidar.c 2004-04-04 Adam Sampson atoll's a static helper function; it shouldn't be in the header. Hash: 7fe328383c4c586f3b4b890431ae1dac01360add Files affected: src/libstatgrab/tools.h 2004-04-04 Adam Sampson Make copy_string not leak memory on realloc() failure. Make copy_string static. We probably ought to move copy_string to tools.c/h at some point in the future, since it's useful. Hash: 630d7c0b8d0a01bebd25fadc9f62df6a6ac06fc7 Files affected: src/libstatgrab/disk_stats.c 2004-04-04 Adam Sampson Make disk_stats use vectors. (Note that this introduces some harmless strict aliasing warnings on GCC 3.3; I'll do something about that later.) Hash: 2963ae4b894282e2812529b390d6d1f7c8a1ccbe Files affected: src/libstatgrab/disk_stats.c 2004-04-04 Tim Bishop Add an get_kvm2 function to open kvm with slightly different args. This set of args doesn't seem to need elevated privileges, but in my last test wouldn't perform the functions required in swap_stats. Hash: 013edd4dbcc40b6f767e48e3d09d2ee4d8ab0c4b Files affected: src/libstatgrab/process_stats.c src/libstatgrab/tools.c 2004-04-04 Adam Sampson Fix TIME_T printing on systems where time_t isn't a long. Hash: d2f4eadb953940c199989619e5b4f47122361473 Files affected: src/statgrab/statgrab.c 2004-04-04 Tim Bishop Fix a bunch of warnings. Hash: b52543e8c8f1bb30a5be9b9d5951fb0ed4eaaa99 Files affected: src/libstatgrab/network_stats.c src/libstatgrab/process_stats.c src/libstatgrab/swap_stats.c 2004-04-04 Adam Sampson Silence a (harmless) "enumeration value `UNKNOWN' not handled in switch" error. Hash: a76c7e6c921ca1be8c585db04e146dea355e5af8 Files affected: src/libstatgrab/process_stats.c 2004-04-04 Adam Sampson get_proc_snapshot returns an integer, not a pointer. Hash: 918a4b2fbe4ffd04473e92ef001556f560c3036d Files affected: src/libstatgrab/process_stats.c 2004-04-04 Adam Sampson Silence 40-odd (harmless) "use of assignment suppression and length modifier together" errors. Hash: 69fdac7898618dfa6c061dc36f8a9ff2a1dc0694 Files affected: src/libstatgrab/process_stats.c 2004-04-04 Adam Sampson Silence another (harmless) "may be used uninitialised" error. Hash: 90c94f6e44e750ddae92a16d2f52b524719339e4 Files affected: src/libstatgrab/network_stats.c 2004-04-04 Adam Sampson Silence a (harmless) "may be used uninitialised" error. Hash: df1838f930cab7333502d366497f5e6f03d6f49b Files affected: src/libstatgrab/disk_stats.c 2004-04-04 Tim Bishop No longer need kvm on FreeBSD 5, OpenBSD, and NetBSD. Hash: 9d323cdf526dd22c9198d80efacc7c343469453c Files affected: configure.in 2004-04-04 Tim Bishop This has been a bit more complex than it probably should have been. We now have the command line arguments on FreeBSD5, NetBSD, and probably OpenBSD without using kvm. The sysctl interface provided the required information. However, on FreeBSD 4 and Dragonfly BSD there was no matching sysctl interface, so the kvm way remains. Fortunately neither of those two OS's require elevated privileges to use that bit of kvm. Finally in a decent position with no elevated privileges required for this section of code, on any of the BSD's. Still one bug to fix: there are 5 "null" processes on the end of the list. This has been introduced at some point, because it wasn't there yesterday. Hash: 3c8e47515509700ba6efafcf05965a35ee35bbff Files affected: src/libstatgrab/process_stats.c 2004-04-04 Adam Sampson Add a macro for declaring static vectors too. Hash: e763a92eb3c5dd7fa66e50b403b9e32514041401 Files affected: src/libstatgrab/vector.h 2004-04-04 Adam Sampson Add generic vector-handling code. This can be used to implement resizable arrays of objects with optional initialisation/destruction functions. Hash: 825cd5386d21e122484a7430d51688d8fa59e682 Files affected: src/libstatgrab/Makefile.am src/libstatgrab/vector.c src/libstatgrab/vector.h 2004-04-04 Tim Bishop Revert to using sysctl instead of kvm to get process stats. This should be more compatible with NetBSD and OpenBSD. Still need to use kvm to get the command line args, but this seems unavoidable. At this stage we don't bail if kvm fails (eg. not enough privs), instead the command line args will just be set to NULL. Seems a fair compromise. Hash: e384144bb6187df9bd18804199d175606374aad1 Files affected: src/libstatgrab/process_stats.c 2004-04-04 Tim Bishop Add support for DragonFly BSD. Seems to be working correctly, and works without needing any extra privileges. Some stuff comes from proc.h, whilst some comes from thread.h. A word of warning - the DragonFly folk seem to be changing a lot of stuff to do with processes and threads, so it's likely this could break very easily :-) Hash: 0a9f41502ad3439ef435f20608793067e08254ee Files affected: src/libstatgrab/process_stats.c 2004-04-04 Tim Bishop Support for OpenBSD, although it suffers the same problems as NetBSD. Hash: b6efd4b3fc247ee9b9bd5673e6444b2cb80efcc1 Files affected: src/libstatgrab/process_stats.c 2004-04-04 Tim Bishop This adds support for NetBSD, although it currently needs elevated privileges. I will try and fix that. Hash: d7520594744a284dd8e1039f13f37d469ec386e1 Files affected: configure.in src/libstatgrab/process_stats.c 2004-04-04 Tim Bishop Handle failure to get a snapshot. Hash: 53ff461995d7496d44690cf7586f389f9c21eee5 Files affected: src/libstatgrab/process_stats.c 2004-04-03 Tim Bishop Add default to case statement which uses the UNKNOWN process state. Hash: 37170dbade0a4a2e79208e6d515b6390c708c5b1 Files affected: src/libstatgrab/process_stats.c 2004-04-03 Tim Bishop Add support for FreeBSD 4. I suspect this may work on OpenBSD and NetBSD too, although I'll need to verify that. Also add an additional process state of UNKNOWN. Hash: 677d7c41d89c530f3f6c1af87994630b6030f4c9 Files affected: examples/process_snapshot.c src/libstatgrab/process_stats.c src/libstatgrab/statgrab.h 2004-04-03 Tim Bishop Now need -lkvm on FreeBSD 5. Hash: 77f08e4a725c8742c1b4049ffd6412f43c067e52 Files affected: configure.in 2004-04-03 Tim Bishop Add test for failure to get stats. Hash: 3b4a29ed0b281ac73430d31751085dbbdd3e2d98 Files affected: examples/process_snapshot.c 2004-04-03 Tim Bishop Got the command line args. Now using kvm to get information, although fortunately this doesn't need any special privileges. Switched to using kvm to get the process listing too. When no command line arguments available doing something similar to ps and putting the command name in brackets. Hash: 247c78915f3b6c7abea4ca21b73228a7d6ec108d Files affected: src/libstatgrab/process_stats.c 2004-04-03 Tim Bishop Fix CPU percentages on FreeBSD 5. Set args to NULL until we can figure out how to collect them. Still need to add code for other BSD's. Hash: 61d3aa94f823f7c0437b06d16766c559e9f745cd Files affected: src/libstatgrab/process_stats.c 2004-04-03 Tim Bishop Add process_snapshot example for testing the new process stats code. Hash: 7cf41642709993c8c1f7ebfa9b17685d6dc2725b Files affected: examples/Makefile.am examples/process_snapshot.c 2004-04-02 Tim Bishop Reimplement get_process_stats. I presume the plan was to rewrite this to use the new function for collecting stats :-) Seems to work on FreeBSD5 - but I'm not entirely convinced my BSD code is working yet. Hash: 9e4d96f1710ef79bb270a9e10d0324adee7eb705 Files affected: src/libstatgrab/process_stats.c 2004-03-30 Tim Bishop The startings of the BSD code. Only works on FreeBSD 5 so far. Doesn't yet do command line arguments, or CPU percentages correctly. Hash: cfc20ab4e7be0f7853a915f66b8a976418ce048e Files affected: src/libstatgrab/process_stats.c src/libstatgrab/statgrab.h 2004-03-30 Peter Saunders Basic framework for linux.. Doesn't do CPU on a per process basis, as i'm not sure the best way to approach that yet. Hash: 3f50d6e2fadfdd4cd0d61adf60f8f05449ff9f60 Files affected: src/libstatgrab/process_stats.c 2004-03-28 Peter Saunders Added the state for solaris Hash: 104a547386c340477d93627fe491a2e03e4cf6b5 Files affected: src/libstatgrab/process_stats.c 2004-03-28 Peter Saunders Modifying the type of process states to an enum. The names maybe a touch unfriendly however..? Hash: 8c9ba14632dd6bf0777c491a01ecccf008160c14 Files affected: src/libstatgrab/statgrab.h 2004-03-28 Peter Saunders The start of the rework for process_stats to give more information, and to become a standard proc interface. Hash: 01ecf001e1f679d2638edee618c99f37bdee94cf Files affected: src/libstatgrab/process_stats.c src/libstatgrab/statgrab.h 2004-03-20 Tim Bishop We don't need kvm on FreeBSD 5 any more. Hash: a3cd20e84422f3617a01f00cca29e9b3fcd451e8 Files affected: src/libstatgrab/tools.c 2004-03-20 Tim Bishop The libstatgrab python bindings are now their own package - pystatgrab. Hash: a35d0b2ca077c09bd1d57473cccd2ebf8d05330d Files affected: Makefile.am extras/python/setup.py extras/python/statgrab.pyx 2004-03-19 Adam Sampson People using devfs have partition names longer than 20 characters. Hash: 0acc5cdd5e1feb70ed5d3099584e3ad51ac84261 Files affected: src/libstatgrab/disk_stats.c 2004-03-17 Adam Sampson Add a workaround for NetBSD: the first call to get_uvmexp() doesn't fill in the structure, so we would normally get junk values on the first call that used it. Hash: 38a604e5e1fc853125a6e9b17ca09c7ce3cdef84 Files affected: src/libstatgrab/tools.c 2004-03-11 Tim Bishop Put libstatgrab URL, rather than i-scream URL, in the docs. Hash: d0bf8015fc268962ffa31c7a010babc6ab45ed3c Files affected: docs/cpu_percent_usage.xml docs/get_diskio_stats.xml docs/get_general_stats.xml docs/get_load_stats.xml docs/get_memory_stats.xml docs/get_network_iface_stats.xml docs/get_network_stats.xml docs/get_page_stats.xml docs/get_process_stats.xml docs/get_user_stats.xml docs/libstatgrab/sg_get_cpu_stats.xml docs/libstatgrab/sg_get_disk_io_stats.xml docs/libstatgrab/sg_get_host_info.xml docs/libstatgrab/sg_get_load_stats.xml docs/libstatgrab/sg_get_mem_stats.xml docs/libstatgrab/sg_get_network_iface_stats.xml docs/libstatgrab/sg_get_network_io_stats.xml docs/libstatgrab/sg_get_page_stats.xml docs/libstatgrab/sg_get_process_stats.xml docs/libstatgrab/sg_get_user_stats.xml docs/libstatgrab/statgrab.xml docs/sg_get_cpu_stats.xml docs/sg_get_disk_io_stats.xml docs/sg_get_host_info.xml docs/sg_get_load_stats.xml docs/sg_get_mem_stats.xml docs/sg_get_network_iface_stats.xml docs/sg_get_network_io_stats.xml docs/sg_get_page_stats.xml docs/sg_get_process_stats.xml docs/sg_get_user_stats.xml docs/statgrab.xml 2004-03-09 Tim Bishop Post release version increment. Hash: 1e0614d2a993b962d2add9ebc16d9601189355da Files affected: configure.in extras/python/setup.py 2004-03-09 Tim Bishop Mention what UNKNOWN_DUPLEX could mean. Hash: e59176b6b193d39108b48e7a62f9494d5249cedb Files affected: docs/get_network_iface_stats.xml docs/libstatgrab/sg_get_network_iface_stats.xml docs/sg_get_network_iface_stats.xml 2004-03-09 Adam Sampson Rework transfer_diff so that it doesn't need an inexpressible constant on 64-bit systems. Add OpenBSD to the platforms with 32-bit transfer stats. Hash: daa9723389f00b62138fc55d87c2f558257a64e6 Files affected: src/libstatgrab/network_stats.c 2004-03-09 Tim Bishop Add note about privileges, and more comment on state of cygwin port. Hash: 50f731e6e2d07b8c79ec1face4cdfa23e9507626 Files affected: PLATFORMS 2004-03-09 Tim Bishop Add note about PLATFORMS to the NEWS file. Hash: ec092bc1bc706413bab45d7b72dde974223371d2 Files affected: NEWS 2004-03-09 Tim Bishop Add platform specific notes (particularly on required privileges) to the PLATFORMS file. Hash: 55a3546794494ef3a96a98da16c1fa50989486eb Files affected: PLATFORMS README 2004-03-09 Adam Sampson Add a FIXME note on the network interface stats code; some Solaris interfaces have packet counts but not byte counts, so it would be useful to return those once we have a way of indicating the byte count is unknown. Hash: d5ed76edd2aa59052a172bb1fd62040411458356 Files affected: src/libstatgrab/network_stats.c 2004-03-08 Tim Bishop Getting ready for 0.9. Hash: 984625282dd063fce3dace56851890c4ec89add6 Files affected: NEWS src/libstatgrab/Makefile.am 2004-03-08 Tim Bishop On OpenBSD IFM_1000_TX is defined to be IFM_1000_T. We can't have both in our case statement, so ignore IFM_1000_TX. Hash: 7fb2fa03eb4c15020ab3adc00ded628a5390159e Files affected: src/libstatgrab/network_stats.c 2004-03-08 Tim Bishop Add support for new network stats on Solaris. Please check this change cos this is the first time I've coded Solaris stuff :-) Hash: d48452894f0fa2d1b9fd922bffee94e00b3fee6f Files affected: src/libstatgrab/network_stats.c 2004-03-08 Tim Bishop The values are long long, not long. Hash: a42c13b61bce7cc1599378b84289d6feb0d5ea85 Files affected: examples/network_traffic.c 2004-03-08 Tim Bishop Change MAXVAL to Hex. I've made an assumption that they were +1 too big before. I might be wrong, though. Hash: ed2dfa7957b6de46f9dd4770f55c59b10d1799e4 Files affected: src/libstatgrab/network_stats.c 2004-03-08 Tim Bishop Fix layout problems with network traffic example. Hash: 847643e04780fdc3eeff4a4c5b1c174deb3255ef Files affected: examples/network_traffic.c 2004-03-06 Tim Bishop Update documentation to know about the new functions and return data. Hash: c3130b05a631b690d9de3b4c4bc7fbb6e62673b8 Files affected: docs/Makefile.am docs/get_network_iface_stats.xml docs/get_network_stats.xml docs/libstatgrab/sg_get_network_iface_stats.xml docs/libstatgrab/sg_get_network_io_stats.xml docs/libstatgrab/statgrab.xml docs/sg_get_network_iface_stats.xml docs/sg_get_network_io_stats.xml docs/statgrab.xml 2004-03-06 Adam Sampson "And if a 4 turned out to be 9, I don't mind, I don't mind..." Fix regexec result count. Hash: 0c07b933bb6b36dd68e8b69830147070d128286b Files affected: src/libstatgrab/network_stats.c 2004-03-06 Tim Bishop Fix bug in network_iface_stats example - I forgot to increment pointer :-) Hash: 66ea3c3c75fed0c3e1e851b08e58d9cd98b8d26c Files affected: examples/network_iface_stats.c 2004-03-06 Tim Bishop Update network traffic example to make it aware of new data. Hash: db8b36c34ae68c7cf4e156b49a7233d386827dc1 Files affected: examples/network_traffic.c 2004-03-06 Adam Sampson Chase new network interface stats. Hash: 4ad5fe1b4c21dfd5ca71c233f15a4ccf50b39e54 Files affected: src/statgrab/statgrab.c 2004-03-06 Adam Sampson Make the network stats regexp simpler. Since /proc/net/dev is a fixed format, there's no need to use [[:space:]] and [[:digit:]]; a literal space and [0-9] will suffice. Hash: 60cfa970ef88d085f3a104d3121bb7a8aa7c18f5 Files affected: src/libstatgrab/network_stats.c 2004-03-06 Adam Sampson Make the regexp match array the right size for Linux. Hash: 13f0fc81cd8bab7e9df35dd56650e99ba70c632e Files affected: src/libstatgrab/network_stats.c 2004-03-06 Tim Bishop Add new features to python wrapper. Hash: 6d167bf6d898a2c691626f71ec82b47814393304 Files affected: extras/python/statgrab.pyx 2004-03-06 Tim Bishop Add support for errors/packets/collisions to Linux. Hash: bd13cddb002ee3a6570bfecd459e8ebe8afaf23b Files affected: src/libstatgrab/network_stats.c 2004-03-06 Tim Bishop Make the rest of the code aware of the new values in the struct. Hash: 3a3050355db9addbff909ed94b71c958a5b0dd46 Files affected: src/libstatgrab/network_stats.c 2004-03-06 Tim Bishop Add getting errors, packets, and collisions for network interfaces on BSD. Hash: f23411758fb2b3796009d19ee1f2aab0db4e6779 Files affected: src/libstatgrab/network_stats.c 2004-03-04 Tim Bishop An "idea" what the network stats might look like with extra stuff in. Pete, please approve/fix then I'll do the BSD code :-) Hash: 196dd4e7476e751f0f7671f894b402edf716b8a5 Files affected: src/libstatgrab/statgrab.h 2004-02-18 Adam Sampson Buggy Solaris qsort/bsearch still try to access the array if the length is zero. Hash: ac249514c1716f4855276935c80f7510fbe8f3c7 Files affected: src/statgrab/statgrab.c 2004-02-16 Tim Bishop Add support for DragonFly BSD 1.0. Also a minor tweak to the network interface code to make it more portable. Hash: 0ccfd296db0b6bcf017517ea6fdea20581a2f9e4 Files affected: PLATFORMS configure.in src/libstatgrab/cpu_stats.c src/libstatgrab/disk_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/network_stats.c src/libstatgrab/os_info.c src/libstatgrab/page_stats.c src/libstatgrab/process_stats.c src/libstatgrab/swap_stats.c src/libstatgrab/tools.c src/libstatgrab/tools.h src/libstatgrab/user_stats.c 2004-02-15 Tim Bishop Seems we sometimes need root privs on linux :/ Hash: f8844e1d961308f9a43fe5d92d54ef214b760987 Files affected: configure.in src/saidar/Makefile.am src/statgrab/Makefile.am 2004-02-15 Tim Bishop Update AUTHORS; it's not quite so clear cut anymore, so just list names. Hash: 883958708f5d315249fcd2e2906aaff2d4c33483 Files affected: AUTHORS 2004-02-14 Adam Sampson get_kvm() only on FreeBSD. Hash: 8f0c356ce1fb994d4dee7ab07302d6382c5ac37e Files affected: src/libstatgrab/tools.h 2004-02-14 Tim Bishop We don't need to be setuid root on Solaris 8+. On Solaris 7 and below we do need to, but only if we care about the disk mappings. This leaves us needing to be setuid root for disk mappings on Solaris 7 and below, and needing setgid kmem on FreeBSD 4 for swap statistics. Hash: b5a4792302f1b04a0222e86e80a6426ed4d1a068 Files affected: configure.in 2004-02-14 Tim Bishop Change swap_stats on FreeBSD 5 - no longer uses kvm. This means that we no longer need setgid kmem on FreeBSD 5, or kvm, at all. However, this change doesn't work on FreeBSD 4 - so kvm is still needed there. Hash: ff66078d38d9f5bed01da0de8e212a1f207cfd2f Files affected: configure.in src/libstatgrab/swap_stats.c 2004-02-14 Tim Bishop Chase changes in statgrab.h. Hash: 350e1e88734c1051c9519ee246be838c65361609 Files affected: extras/python/statgrab.pyx 2004-02-14 Adam Sampson Rework iface_stat code for Solaris so that it uses SIOCGIFFLAGS to find out whether an interface is up or not. This means that we need to link with -lsocket -lnsl now to get socket(). Also make the comment about when bytes-transferred stats a bit more explicit. We're now in the slightly odd situation where it's possible for an interface to show up in either or both of get_network_stats and get_network_iface_stats: for instance, on raptor at the moment, ce0 is in use so shows up in both, lo0 doesn't have kstats for bytes transferred and thus only shows up in the second, and ce1 exists but hasn't been plumbed so only shows up in the first. I'd be mildly inclined to "fix" this by making get_network_stats do a SIOCGIFFLAGS ioctl so unplumbed interfaces don't show up at all (and add packets received/transmited to the get_network_stats result so we can at least show something for lo0). Hash: d3b089b3212654ca707bdec1b93ea993e28eb446 Files affected: configure.in src/libstatgrab/network_stats.c 2004-02-14 Adam Sampson Move free inside the right #ifdef, and fix a memory leak when sysctl fails. Hash: 0dbfac505eaf0fc3b85b424a648e95bee2b4fa34 Files affected: src/libstatgrab/process_stats.c 2004-02-14 Tim Bishop Look at all the process states on all the BSD's. Tidly done using ifdef's. Hash: c7f808d8fed1935cc6e1f9951a1008837e4c5ad8 Files affected: src/libstatgrab/process_stats.c 2004-02-14 Adam Sampson ifaces doesn't need to be static. Hash: a66565347516e268b9da736e03f0fcecfbbc6712 Files affected: src/libstatgrab/network_stats.c 2004-02-14 Adam Sampson There's no need to get_uvmexp on startup on NetBSD any more. Hash: 644ad27a9494952cead90bbe8fc382719e7dd99d Files affected: src/libstatgrab/tools.c 2004-02-14 Tim Bishop kvm is now only needed for FreeBSD, so change defines accordingly. Hash: 3befdae60fd466f4c2e9b0c82bb3993fdf88be6e Files affected: src/libstatgrab/tools.c src/libstatgrab/tools.h 2004-02-14 Adam Sampson Define u64 to fix Linux 2.4.21 build. Hash: aba1e60e690ca6db8663ac59d30a486129db3556 Files affected: src/libstatgrab/network_stats.c 2004-02-14 Tim Bishop NetBSD and OpenBSD no longer need any elevated privileges, or any extra libraries to link against. Hash: fb783fc0b4262d667697fa8cd798e8a780f10ea9 Files affected: configure.in 2004-02-14 Peter Saunders Fixed compile error. We not sure that link_up gets us what we want tho. Hash: 68dbd048ed03eca7ef4addbcedc259014f7e9094 Files affected: src/libstatgrab/network_stats.c 2004-02-14 Tim Bishop Switch process stats to using sysctl on ALLBSD. On OpenBSD and hopefully NetBSD (this hasn't been tested yet - but I'm quite confident) this means we no longer need any elevated privileges. Hash: 1e8581ff0006884f1cb0c490825131ff8b862a83 Files affected: src/libstatgrab/process_stats.c 2004-02-14 Adam Sampson Rearrange the BSD network_iface_stat code in the same way as the Linux code; try SIOCGIFFLAGS first to find out whether the interface is up, then only fill in the other information if it's available. Hash: cebf0376c8581d59397739c9b2a00407a395a43e Files affected: src/libstatgrab/network_stats.c 2004-02-14 Adam Sampson Make the unknown speed 0 to match the BSD code. Hash: 4ff1ff8eefca76f11ec7880a7b211c385d87fbd3 Files affected: src/libstatgrab/network_stats.c 2004-02-14 Adam Sampson Tidy up the Linux iface_stat code. - fclose(f) once we're done to avoid fd leak - no need to malloc struct ethtool_cmd since it's of constant size (and this avoids some odd-looking casts) - use switch rather than multiple ifs for duplex codes - use SIOCGIFFLAGS ioctl first to find out whether the interface is up, since this works on all interfaces The user-visible change here is that ->speed and ->dup now get filled in with -1, UNKNOWN_DUPLEX for interfaces that don't support SIOCETHTOOL. Fixing this properly is on the todo list... Hash: 8728d2b4c24c16c870f76f80b59a181ef9afcfad Files affected: src/libstatgrab/network_stats.c 2004-02-14 Adam Sampson Rename BSD "int s" to "int sock" to match Linux code and fix compile error. Make BSD code set the interface name before calling ioctl so it gets the stats for the right interface. Hash: 8b2935c701b2aaa11af1856b3dfb2d60aaea2fa5 Files affected: src/libstatgrab/network_stats.c 2004-02-14 Adam Sampson Add support for interface .up. Hash: 3ac9c1951cefd3ca1bb07f0852eb328905e79370 Files affected: src/statgrab/statgrab.c 2004-02-14 Adam Sampson uvm.h needs sys/time.h on NetBSD to get struct timeval. Hash: 8b551144c0c978c690c691dea4a1655cb2b9581d Files affected: src/libstatgrab/memory_stats.c src/libstatgrab/swap_stats.c 2004-02-13 Peter Saunders *bsd didn't do what i wanted. Still needs testing for all platforms. Hash: baae0072dd871ca5641994c5efde03977017809d Files affected: src/libstatgrab/network_stats.c 2004-02-13 Peter Saunders Added up/down interface detection. Not tested (or even compiled) on any os. So that really needs to be done :) Hash: 5449b6972857ca14cd0c0ade7407c0dffa88c6f8 Files affected: src/libstatgrab/network_stats.c src/libstatgrab/statgrab.h 2004-02-13 Tim Bishop Chase statgrab_duplex name changes. Add variables that can be accessed within python for the duplex enum. Hash: fa7ebb339bd882fcc9e8d363d79e7ccea25ea3b4 Files affected: extras/python/statgrab.pyx 2004-02-13 Tim Bishop Finish support for OpenBSD. Get disknames out of sysctl as well for Disk IO. Fix memory/page/swap stats to use get_uvmexp in tools.c (same as NetBSD). Hash: ab2ea9abf3426b39a8af9ac774d69966587b7fd9 Files affected: src/libstatgrab/disk_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/page_stats.c src/libstatgrab/swap_stats.c src/libstatgrab/tools.h 2004-02-13 Tim Bishop Remove debugging line. Hash: 209625088387e6ccada30293481c7efc54f07aa0 Files affected: examples/network_iface_stats.c 2004-02-13 Tim Bishop Add example for network_iface_stats. Fix duplex on Solaris. Hash: 44361e286f677e32b2b1c906bbb26af8973f30ee Files affected: examples/Makefile.am examples/network_iface_stats.c src/libstatgrab/network_stats.c 2004-02-13 Peter Saunders Solaris bug fix for duplex detection. Hash: 9e256525238d82e2009ca799f7ab324eb70a32e1 Files affected: src/libstatgrab/network_stats.c 2004-02-13 Adam Sampson Fix another DUPEX-for-DUPLEX typo. Include to get the definition of close(). Hash: 0f8350ae9857a6cd72f819bb30277f79d2a0d337 Files affected: src/libstatgrab/network_stats.c 2004-02-13 Adam Sampson Use sysctl to read struct uvmexp, since this works on both NetBSD and OpenBSD. Hash: d62088ba5097f26d967fb39b3aac24cc8e6aa796 Files affected: src/libstatgrab/tools.c 2004-02-13 Adam Sampson Track rename of duplex to statgrab_duplex. Hash: bd794b72370dcd2aa1cff79bedc7ab9de5085e4c Files affected: src/statgrab/statgrab.c 2004-02-13 Adam Sampson DUPLEX, not DUPEX. NetBSD has FreeBSD 5-like speed definitions. Hash: a664aa62309dbe61b16e019aba8b7d827e09dc1c Files affected: src/libstatgrab/network_stats.c 2004-02-13 Peter Saunders Added a couple of forgotten close's. Hash: 1dd6d7ba99fadf16bce6a6c03d51011546efc7a7 Files affected: src/libstatgrab/network_stats.c 2004-02-13 Peter Saunders Couple of name changes, and a tidy up. Hash: 56c63e4b1d43dcc3c46953431e5e6db62bf881f7 Files affected: src/libstatgrab/network_stats.c src/libstatgrab/statgrab.h 2004-02-13 Adam Sampson Add network_iface_stat support. Hash: 799496383b8fe288193e7a2af52a1f5a7e1c8199 Files affected: src/statgrab/statgrab.c 2004-02-13 Tim Bishop There's no need to return how many entries are in a list at the start of the list. There's much easier ways to work out how many there are :-) Hash: 25823ee034268ba08a066c331a90035fa8036661 Files affected: extras/python/statgrab.pyx 2004-02-13 Tim Bishop Bring the python extension up-to-date with the latest libstatgrab functions. Still need to look at that enum thing and how best to use it. Hash: 109e9645e3388083a8fbec5f8d11a71469fad28a Files affected: extras/python/setup.py extras/python/statgrab.pyx 2004-02-12 Tim Bishop Fix on FreeBSD 5. Also add IFM_1000_FX missed on FreeBSD 4. Hash: 7b1776a1a01ae65ff9d7f890c53d699c09bd1ebb Files affected: src/libstatgrab/network_stats.c 2004-02-12 Tim Bishop We'll almost certainly go with 0.9 for our next release. Hash: 8704e02b9483f46a318e7619d80f9392f220e91d Files affected: configure.in 2004-02-12 Tim Bishop Add preliminary support for OpenBSD (tested on 3.3). All works apart from Disk IO stats - currently the disks are not named correctly. The fix for this is probably to use KVM. Mostly similar to the NetBSD code, the notable exception being the uvm stuff. In NetBSD there's a function to get it, in OpenBSD sysctl is needed to get hold of it. Hash: 70dc2fdc3edb6b782a76578ee2c16671849dc124 Files affected: PLATFORMS configure.in src/libstatgrab/cpu_stats.c src/libstatgrab/disk_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/page_stats.c src/libstatgrab/swap_stats.c src/libstatgrab/user_stats.c 2004-02-12 Peter Saunders Added network interface stats for linux. Points to remember: a) This code will need to be run as root. Otherwise, it should safely return null. b) the "speed" may be incorrect if the interface is not actually up and talking to anything. However, duplex will be set to NO_DUPLEX so as long as they use that test first, there should be no problem. (This is safe assumption to work on, even for other platforms) c) This was a nastyish and hard bit of code. Maybe bugs, would appricate a look over by people :) Hash: 628944eca72e2f503769e371c11c8fa7238ae396 Files affected: src/libstatgrab/network_stats.c 2004-02-10 Tim Bishop StatgrabException should be derived from Exception. Hash: 6cf61a903ba9cd2a279204dfb42766cea5625dd6 Files affected: extras/python/statgrab.pyx 2004-02-10 Tim Bishop Post release version increment. Hash: 5ac6c5e0090a93ae409f75c53a6a1743468da54d Files affected: extras/python/setup.py 2004-02-10 Tim Bishop Update version. Hash: 2afc42989f9d789043820b56a08a39b67880ba2b Files affected: extras/python/setup.py 2004-02-10 Tim Bishop Post release version increment. Hash: 4c6b279c82bc98493f2384b040f57aa09cfdbc75 Files affected: configure.in 2004-02-10 Tim Bishop Update for release of 0.8.2. Hash: be64fcdbca598b7ecec5dc9b8d18f7a3d108e3e2 Files affected: NEWS PLATFORMS src/libstatgrab/Makefile.am 2004-02-10 Tim Bishop Make setup.py figure out compiler flags using pkg-config. This makes it portable across platforms. Hash: ff798dc0ad666100269eae34ab533815b63bf3a8 Files affected: extras/python/setup.py 2004-02-10 Tim Bishop On solaris 6/7 test for libdevinfo and only try to link it if we find it. Hash: 26679c8084ff2523db3e8b75c4fe71e37ca74357 Files affected: configure.in 2004-02-10 Peter Saunders Added extra ifdef due to compile error Hash: ebe310115af382e0eb1d4daadb29dc98d42f7400 Files affected: src/libstatgrab/tools.c 2004-02-10 Peter Saunders Ooops, wrong logic and didn't think hard enough about it. Hash: 095138f918b26c8a56ad367f28aea1419be117a4 Files affected: src/libstatgrab/tools.c 2004-02-10 Peter Saunders Solaris 6 doesn't have libdevinfo. So, as a way to get it to compile, we will not do the drive mappings sol 6 and lower. Hash: 5d5040df0681960985d5df4e3fe1e7385bf64a45 Files affected: src/libstatgrab/tools.c 2004-02-10 Tim Bishop Add check for libdevinfo.h Hash: 6d4c3dd7c350192e9d7ada76878d602f07966e42 Files affected: configure.in 2004-02-10 Peter Saunders Fix it so it will actually work :) Hash: 28cccdc01f439258435fa920a0e4a3a3d1ba699c Files affected: src/libstatgrab/load_stats.c 2004-02-10 Peter Saunders Allow load_stats to work on solaris 6 (and probably 5) Hash: 26bfd7cc4d1f6a93ecd5585df450d8a86663b680 Files affected: src/libstatgrab/load_stats.c 2004-02-10 Tim Bishop Add check for sys/loadavg.h. We need to test for it on Solaris 2.6... Hash: a08a2ed7a8520a18b1d7d8a6317b34098ba22f99 Files affected: configure.in 2004-02-09 Tim Bishop statgrabmodule -> statgrab. Hash: 4b2eb66df368ec4fd74da3af570105277b3ed995 Files affected: Makefile.am 2004-02-09 Tim Bishop Add error checking to the python bindings. They previously didn't check for a NULL response from the libstatgrab functions - which resulted in python core dumping. It now raises an exception instead. Also add a first stab at a setup.py so people can quickly build/install this extension if they want. Hash: bfc5d417631f3733c9a18ecee7c2bef97e0b040d Files affected: Makefile.am extras/python/setup.py extras/python/statgrab.pyx 2004-02-06 Tim Bishop Return objects instead of hash-like-things :) Hash: 031f1fc19d0108167409762d46966f65861de421 Files affected: extras/python/statgrab.pyx 2004-02-06 Tim Bishop Add the python wrappers to the Makefile so they're added to the dist. Hash: 570366d5abd24ccd9d8f75c630102ccb86f2aede Files affected: Makefile.am 2004-02-06 Tim Bishop Add libstatgrab python wrapper. This won't be installed with libstatgrab, or in fact have anything done to it - it's just there if people want it. If it matures, I'll consider making it a package in it's own right. Hash: e5b63cd083e48a1c9acc915fcce8f1c7c0309d62 Files affected: extras/python/statgrab.pyx 2004-01-25 Peter Saunders Added code for freebsd to do the network interface speeds. I've put it under the label ALLBSD however, as i suspect it will work on all the BSD's of intrest. Hash: 76e9506ba09297f5ec2a070a6f1bef5f36e49cb6 Files affected: src/libstatgrab/network_stats.c src/libstatgrab/statgrab.h 2004-01-23 Peter Saunders Added the ability to get the interface speed/duplex for solaris. Not really checked code, but it appears to work. Hash: 806a6a52c2e41dafc6d5ab4cb573670c6cfc57e8 Files affected: src/libstatgrab/network_stats.c src/libstatgrab/statgrab.h 2004-01-21 Adam Sampson Tidy up get_network_stats_diff and get_diskio_stats_diff. Hash: 23695ae8f29cafbb8131bb5f5d0cc0bba028835b Files affected: src/libstatgrab/disk_stats.c src/libstatgrab/network_stats.c 2004-01-21 Adam Sampson Fix build on NetBSD. Hash: 1b54bd2d02d2e832dc254adaf48ae88f88d9f9ea Files affected: src/libstatgrab/user_stats.c 2004-01-21 Tim Bishop Fix compile error on cygwin. Hash: 15f4fae2bb1b477506a07ecda4df0c9026e75169 Files affected: src/libstatgrab/user_stats.c 2004-01-21 Tim Bishop Very minor fix to saidar. It happily accepted a negative number for it's delay flag - which wasn't overly useful :-) Hash: 826a862a73aefb670c243fc10db6506fd5ec9fb7 Files affected: NEWS src/saidar/saidar.c 2004-01-19 Tim Bishop Post release version increment. Hash: 7d2f6e4ef5eb1a7a7d0b1a66a72b8157a28afd25 Files affected: configure.in 2004-01-19 Tim Bishop A whole bunch of minor cosmetic changes. Hash: 70dfdfb9a566a7fca8f8c14e0282d4a2f4bd45f2 Files affected: AUTHORS Makefile.am NEWS README README.CVS docs/Makefile.am examples/Makefile.am examples/cpu_usage.c examples/disk_traffic.c examples/load_stats.c examples/network_traffic.c examples/os_info.c examples/page_stats.c examples/process_stats.c examples/user_list.c examples/vm_stats.c libstatgrab.pc.in src/Makefile.am src/libstatgrab/Makefile.am src/libstatgrab/cpu_stats.c src/libstatgrab/disk_stats.c src/libstatgrab/load_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/network_stats.c src/libstatgrab/os_info.c src/libstatgrab/page_stats.c src/libstatgrab/process_stats.c src/libstatgrab/statgrab.h src/libstatgrab/swap_stats.c src/libstatgrab/tools.c src/libstatgrab/tools.h src/libstatgrab/user_stats.c src/saidar/Makefile.am src/saidar/saidar.c src/statgrab/Makefile.am src/statgrab/statgrab-make-mrtg-config.in src/statgrab/statgrab-make-mrtg-index.in src/statgrab/statgrab.c 2004-01-19 Tim Bishop Update relevant files for release of 0.8.1. Hash: 9a0573ca14e9c7cfbe1002df983242942d9217c4 Files affected: NEWS src/libstatgrab/Makefile.am 2004-01-16 Tim Bishop Alter the licensing of libstatgrab. The library part is now under the LGPL, whilst the tools/examples are under the GPL. Both licenses are included in the distribution (and are both now in CVS). Also made a minor alteration to the webpage where it said everything was licensed under the GPL. Hash: 52a2ca4665f94d15c677b0bb12adda397c653b95 Files affected: COPYING COPYING.LGPL Makefile.am README examples/cpu_usage.c examples/disk_traffic.c examples/load_stats.c examples/network_traffic.c examples/os_info.c examples/page_stats.c examples/process_stats.c examples/user_list.c examples/vm_stats.c src/libstatgrab/cpu_stats.c src/libstatgrab/disk_stats.c src/libstatgrab/load_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/network_stats.c src/libstatgrab/os_info.c src/libstatgrab/page_stats.c src/libstatgrab/process_stats.c src/libstatgrab/statgrab.h src/libstatgrab/swap_stats.c src/libstatgrab/tools.c src/libstatgrab/tools.h src/libstatgrab/user_stats.c src/saidar/saidar.c src/statgrab/statgrab-make-mrtg-config.in src/statgrab/statgrab-make-mrtg-index.in src/statgrab/statgrab.c 2004-01-15 Peter Saunders Not the exactly "nice" code. Infact, not entirely happy with it... But, it makes a *massive* speed increase to the statgrab_init() function on solaris. It goes from take 15-20 seconds on pelican to < 1. Hash: 60b2193dc638f0927d99e9179e1fd8c254f92109 Files affected: src/libstatgrab/tools.c 2004-01-10 Adam Sampson Add a couple of missing checks for NULL return values; this fixes the crash when libstatgrab runs out of FDs. Hash: ff8200da67494f4c499dc68702d34a902b1cb9d9 Files affected: src/libstatgrab/disk_stats.c src/libstatgrab/network_stats.c 2004-01-10 Adam Sampson Don't close f twice. Hash: 417291b5a765c1b2431c8f33635e6a6a04112e8f Files affected: src/libstatgrab/disk_stats.c 2004-01-10 Adam Sampson Fix broken comment. Hash: 8fc0a13ae80e229cff49907a68f1e8d0bac0c8d1 Files affected: src/libstatgrab/tools.c 2004-01-09 Peter Saunders As pointed out by azz.... time_t will be needed, thus the #include of sys/types.h Hash: e44981686b7e5cd4d508890636dd376040f00516 Files affected: src/libstatgrab/statgrab.h 2004-01-09 Peter Saunders Solaris 7 "fix" :) Hash: a4a496b82e32cb025352fcf264e1ab5f5b0846bb Files affected: src/libstatgrab/tools.c 2004-01-09 Peter Saunders Removed #ifdef's as they should not be there. Hash: a4c03548e22e74f743b867df900eaa1328f2fa73 Files affected: src/libstatgrab/statgrab.h 2004-01-09 Peter Saunders Added strlcat/strlcpy (taken from openssh). Added a #define for both, and also atoll which we appear to of forgotten about when it was written. Removed that #ifdef around get_ll_match as atoll will now always be defined. Hash: 1da56116b04a58610a310a52b1b113da0aad835b Files affected: src/libstatgrab/tools.c src/libstatgrab/tools.h 2004-01-09 Adam Sampson Oops, yes. f can't be NULL at that point, though. Fix unterminated comment. Hash: 95412139c87974938c58f07ff1ef350db30f0752 Files affected: src/libstatgrab/disk_stats.c 2004-01-09 Peter Saunders Fixed leaking fd in diskio_stats code. Fixed a potential leak in page_stats. Hash: 99796ebbf900a3694dbf069f49443e45feab9010 Files affected: src/libstatgrab/disk_stats.c src/libstatgrab/page_stats.c 2004-01-06 Peter Saunders Moving the MAX_LOGIN_NAME_SIZE to where it should be. Hash: ff89efbf1bf319ce41e72eb1bd87355c2a9022b1 Files affected: src/libstatgrab/statgrab.h src/libstatgrab/user_stats.c 2004-01-06 Peter Saunders Minor correction in docs. Hash: 26fc069362740c634dc5f0f6b56e62dea58b1ce8 Files affected: docs/libstatgrab/statgrab.xml docs/statgrab.xml 2004-01-06 Tim Bishop Post-release version increments. Hash: 22e8d7b277250783d6b1c55297ec8bde4b221e90 Files affected: configure.in 2004-01-06 Tim Bishop We're going with 0.8. Hash: c8e3568b189236f802eb10d9da4cf1ac8c71e12b Files affected: NEWS configure.in 2004-01-06 Tim Bishop Add new drop privileges function to NEWS. Hash: e8fe18afb4f2fe6dee9336d19b6aa3b8f5a93816 Files affected: NEWS 2004-01-06 Tim Bishop Add dropping privileges to all the examples. Hash: 4fdf526dcae4c3635874c3406fe612cd0b0f06a7 Files affected: examples/cpu_usage.c examples/disk_traffic.c examples/load_stats.c examples/os_info.c examples/page_stats.c examples/process_stats.c examples/user_list.c examples/vm_stats.c 2004-01-05 Adam Sampson Make one of the examples use statgrab_drop_privileges. Hash: 79ab2775a9089440584373dbff55a411d82bcef4 Files affected: examples/network_traffic.c 2004-01-05 Adam Sampson Fix a typo. Tidy up the description of statgrab_init a bit. Update the list of supported platforms. Hash: f868c4a1a3764b3eb8aa66dbc3f5a0e95adfce6a Files affected: docs/libstatgrab/statgrab.xml docs/statgrab.xml 2004-01-05 Tim Bishop Update shared library version. Hash: 2ca280b47bc17eb5eda9d3331c4431a532885990 Files affected: src/libstatgrab/Makefile.am 2004-01-05 Adam Sampson Replace duplicated code for dropping privileges with a library function that always drops setuid/setgid privileges. Hash: 0ed4522a8dd693591a63d0449072f6420955307f Files affected: docs/libstatgrab/statgrab.xml docs/statgrab.xml src/libstatgrab/statgrab.h src/libstatgrab/tools.c src/saidar/saidar.c src/statgrab/statgrab.c 2004-01-05 Adam Sampson Remove unused variable "gid". Hash: 7706e8e6aee85e95174c844239dac8edc6a60808 Files affected: src/saidar/saidar.c 2004-01-05 Adam Sampson Drop setuidness on Solaris. Hash: 65dec31411e596492bbbeafd47df2172f8a5f60b Files affected: src/statgrab/statgrab.c 2004-01-05 Tim Bishop Update stuff for new release. Hash: d5c1a2a0e295f1a61f9b43c1d28c9236dcc0a4bb Files affected: NEWS src/libstatgrab/Makefile.am 2004-01-05 Peter Saunders Drop setuid for solaris. Hash: bbf40090d35f32c2ef087d165ef7c9bc02c85f51 Files affected: src/saidar/saidar.c 2004-01-05 Peter Saunders Minor tiding Hash: 7ac0489fe91900a34e8e49bf871fb1888d987f35 Files affected: src/libstatgrab/tools.c 2003-12-12 Tim Bishop On Solaris we sometimes need to be setuid root. Hash: 95c68cf473773b8c10ca54ca32402f12640759b7 Files affected: configure.in src/saidar/Makefile.am src/statgrab/Makefile.am 2003-12-11 Tim Bishop Fix problem with -d flag in saidar. The line removed subtracted 1 from the delay. I guess at some point this was needed, but not now. So setting a delay of 1 resulted in a sleep 0 :-) Hash: b491a8b39f1cd7d70fd31f4a4d1e16d86b025066 Files affected: src/saidar/saidar.c 2003-11-23 Tim Bishop Add statgrab_init() call to the examples. If people are going to copy them I guess we should try and make them correct :-) Also tidied up whitespace in the examples. Hash: 1b321fc8365c6f1384913316a96212b16948722f Files affected: examples/cpu_usage.c examples/disk_traffic.c examples/load_stats.c examples/network_traffic.c examples/os_info.c examples/page_stats.c examples/process_stats.c examples/user_list.c examples/vm_stats.c 2003-11-21 Tim Bishop Add section about new disk mappings. Hash: af446c3febf7ad466ecb2afe2993ab0854280a4c Files affected: docs/get_diskio_stats.xml docs/libstatgrab/sg_get_disk_io_stats.xml docs/sg_get_disk_io_stats.xml 2003-11-20 Tim Bishop Add PLATFORMS file to list the known working operating systems. The list is roughly right, I think. It's just a starting point really. Hash: 203c129ef8b7bb82526c45b5c8134fdeb019a4b1 Files affected: Makefile.am PLATFORMS 2003-11-20 Tim Bishop Turn on the solaris disk mapping code. Fix some minor bugs, and remove some debugging code. Hash: 637fdf1ee3187696d107315b15234818a4b4b1e0 Files affected: configure.in src/libstatgrab/disk_stats.c src/libstatgrab/tools.c 2003-11-19 Tim Bishop Die nasty incorrect whitespace. Ahem. Excuse me. Hash: 0e521e64dd997ab924c0784892dd05947caf06c2 Files affected: src/libstatgrab/tools.c 2003-11-13 Peter Saunders Basic implementation of name mapping for solaris. The code is ugly, mostly because its initially taken from a sun example, and modified. It needs tiding somewhat. I'm not sure if tools.c is the right place for this, i guess it could go in disk_stats.c, but its doing a specific job, and we could right another mini-program which does the disk mappings. Comments welcome about the general implementation. Should we call build_mapping if the user calls get_svr_from_bsd and build_mapping hasn't been run before? Or should we force them to use the init function? (Bare in mind, on some systems, to do the mappings correctly the program will require to be root. (Only ones with a /dev/osa , so everything with an A1000 for e.g.) Hash: 664c601ba74a53fa9014e3a0997076ecb5a0ecd5 Files affected: src/libstatgrab/tools.c 2003-11-12 Tim Bishop Remove a line added for Cygwin that's no longer needed. Hash: 4dec1ba45dc9056538662687b3bf81a7c8bae027 Files affected: src/libstatgrab/load_stats.c 2003-11-12 Adam Sampson Use the userspace limits.h header, not the kernel one. Hash: 17faab46f2d903175c99ebe8cc57c7c17e51aa58 Files affected: src/libstatgrab/process_stats.c 2003-11-12 Adam Sampson Make libstatgrab functions return NULL for stats that can't be fetched on cygwin. Hash: 27955e00dbd0781d228b84f7b23a7b36ebf6a1fa Files affected: src/libstatgrab/disk_stats.c src/libstatgrab/load_stats.c src/libstatgrab/network_stats.c src/libstatgrab/process_stats.c 2003-11-11 Tim Bishop Fix a couple of Cygwin build issues. Not all the #ifdef LINUX's were changed in a previous commit. Hash: cd3989f443ee87711c6e9268aad60f6597b75536 Files affected: src/libstatgrab/cpu_stats.c src/libstatgrab/statgrab.h 2003-11-10 Adam Sampson Strip colons from Cygwin drive names. Hash: 3566ce9ad782dd6100fc60a7d42d7b0e909abf9d Files affected: src/statgrab/statgrab.c 2003-11-10 Adam Sampson Factor out duplicated code that checks for valid FS types. Hash: 9957160f7530ffca096b53624e53ca9471847424 Files affected: src/libstatgrab/disk_stats.c 2003-11-10 Adam Sampson Make Cygwin its own platform, rather than defining LINUX. This stops libstatgrab from trying to fetch stats that Cygwin doesn't have. Hash: 45688f718b75319dd668bd6f94e13e06df1d1040 Files affected: configure.in src/libstatgrab/cpu_stats.c src/libstatgrab/disk_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/os_info.c src/libstatgrab/page_stats.c src/libstatgrab/swap_stats.c src/libstatgrab/user_stats.c 2003-11-10 Adam Sampson Provide atoll() on platforms that don't have it. Hash: d0c7cf72daa4e27328328aa948620d0d272603d9 Files affected: src/libstatgrab/tools.c 2003-11-10 Tim Bishop Add support for cygwin. This is a bit limited, there's a few things that can't be retrieved on cygwin such as load averages, diskio, network io, and process stats. The package compiles and runs, and both saidar and statgrab work. Taken from a patch submitted by Ron Arts . Thanks Ron! Hash: 80739611acc9172b805cab7ddf4fb0aac1f7505b Files affected: README configure.in src/libstatgrab/disk_stats.c src/libstatgrab/load_stats.c src/libstatgrab/process_stats.c src/libstatgrab/statgrab.h src/libstatgrab/tools.c 2003-11-07 Adam Sampson Fix getopt() return value. Hash: 7bc1944750754fb5c066989d54de9bbb6614c36a Files affected: examples/cpu_usage.c examples/disk_traffic.c examples/load_stats.c examples/network_traffic.c examples/page_stats.c examples/process_stats.c examples/user_list.c examples/vm_stats.c 2003-11-07 Adam Sampson Remove a little bit of duplicated code. Hash: f5b14b6b30c5741e75a31bfcebf859e7fce3e5fe Files affected: src/saidar/saidar.c 2003-11-07 Adam Sampson Do the "don't update more than once a second" thing slightly differently; this avoids having it be unresponsive for 20 seconds if you type 20 spaces. Hash: 025f4a95ab87b200975a9bbb361b0794a63d86bc Files affected: src/saidar/saidar.c 2003-11-07 Adam Sampson getopt returns -1 on completion, not EOF. Hash: e6106ed48488772b8e324fe7b31d3daae4f3a25d Files affected: src/saidar/saidar.c 2003-11-07 Adam Sampson Fix type of ch. Hash: de1af90b67cb527acaaf0df152780cbb4489de64 Files affected: src/saidar/saidar.c 2003-11-07 Adam Sampson Use curses' timeout() rather than select(). Hash: d43fb5bb0835dea6720d47f0b5545fbe12fbb3dd Files affected: src/saidar/saidar.c 2003-11-07 Tim Bishop Add a space I removed by accident. Hash: 1998928211d1cc537338b9caab6084b4649ee074 Files affected: src/statgrab/statgrab-make-mrtg-index.in 2003-11-07 Tim Bishop Now generates valid XHTML. Also added a line to the end of the page saying what generated it :-) Hash: 8af9a27d9b644ff0648d9dc2ee6ff090ee02ba33 Files affected: src/statgrab/statgrab-make-mrtg-index.in 2003-10-24 Adam Sampson Support disk IO statistics on Linux 2.6. Remove a couple of unused variables. Hash: 8531cbfd39a4c39d1548bf3bb12902aa8f6ea2a8 Files affected: src/libstatgrab/disk_stats.c 2003-10-24 Adam Sampson Support memory, swap and paging stats on Linux 2.6. For memory and swap, this just means reading the new-style data in /proc/meminfo (since it's present in 2.2 and 2.4 too); for paging, this means trying to read /proc/vmstat if it's available, else reading /proc/stat (for 2.2). Hash: d21c22a25fd1bf3b7e5b06dfa4efd82d7d964bfb Files affected: src/libstatgrab/memory_stats.c src/libstatgrab/page_stats.c src/libstatgrab/swap_stats.c 2003-10-24 Adam Sampson Add the correct type to a couple of long long constants. Hash: 7d37be1c36d26b16ea4ad1690db50beae07fe0be Files affected: src/libstatgrab/network_stats.c 2003-10-24 Adam Sampson Initial Linux 2.6 support. Hash: 073c36dcf759b89d05057ac3dd710ed9852f2798 Files affected: src/libstatgrab/memory_stats.c 2003-10-24 Adam Sampson Move MAX_LOGIN_NAME_SIZE definition to the right place. Hash: bcba79bedb4d8aed2af6e5f30070801a70a386e0 Files affected: src/libstatgrab/statgrab.h src/libstatgrab/user_stats.c 2003-10-24 Tim Bishop Fix when --disable-saidar or --disable-statgrab used on BSD platforms. It seems you can do nested if statements, which is nice. Not sure if you can do combined ones (if foo && bar) or similar, though. Hash: 9a184bd71b7d82e334f02c98771267065cd55b4a Files affected: src/saidar/Makefile.am src/statgrab/Makefile.am 2003-10-24 Tim Bishop Fix for building from NetBSD pkgsrc. There the OS is detected as just netbsdelf, without a version suffix. I've left the elf bit, because I'm not sure what the implications would be for non-elf NetBSD's? Hash: 010156a3125cdacccfb72a69a7a0543f29f044c9 Files affected: configure.in 2003-10-22 Tim Bishop Bump version post release. Hash: 627a3f21fca8840775fd1b91469dc7040b6f5e80 Files affected: configure.in 2003-10-22 Tim Bishop Update the NEWS file to add new platforms we've tested on. Hash: 50cc300b3b99549f6fe5b4e1749f6f34294eb415 Files affected: NEWS 2003-10-22 Tim Bishop Do the divides a bit more safely :-) Hash: d100e577db79fcc89493724a1bc0524b6327c667 Files affected: src/saidar/saidar.c 2003-10-21 Tim Bishop Make saidar display the VM percentages for swap *or* memory if it can, rather than not displaying either if it can't get one or the other. Hash: c8db6a3ac4a49f1bb090c65c6204fdc1bb205304 Files affected: src/saidar/saidar.c 2003-10-21 Tim Bishop Update for new release. Hash: f5b9ff09f6e0990fc6a14548aab60b2d3cf62b98 Files affected: NEWS src/libstatgrab/Makefile.am 2003-10-21 Peter Saunders Added doc's for statgrab_init Hash: 74d96cdaffaaa249b891bc00c18caeed4c23466f Files affected: docs/libstatgrab/statgrab.xml docs/statgrab.xml 2003-10-20 Adam Sampson Only display the stats that are available (rather than bombing out if they aren't all available). Hash: 0b89834a2a29b44b3ece3f662dab0d6be08362b4 Files affected: src/saidar/saidar.c 2003-10-20 Adam Sampson Use statgrab_init and drop privs as soon as possible. Hash: 38bca6a103661a641fcef1106194acf15b6df4e0 Files affected: src/statgrab/statgrab.c 2003-10-20 Adam Sampson Clean up NetBSD memory calculations. Hash: e020eda2291abd98aad7ae4f04e74954f5a250ac Files affected: src/libstatgrab/memory_stats.c 2003-10-20 Peter Saunders Changed the style slightly to be more readable. Hash: aacf8be61fba91dfce2ef8cf1374f477feea4e96 Files affected: src/libstatgrab/tools.c 2003-10-20 Peter Saunders Added statgrab_init() This function just calls the get_kvm type functions so all special privilages can be dropped after this function has been called. It currently only does stuff on *bsd (and needs testing on netbsd). All other OS's will just have a function that returns 0 Solaris at somepoint may need to do something here so we can do the drive mappings. Hash: 5ede5c120eea442deaa7a7bacecad218410b4c51 Files affected: src/libstatgrab/statgrab.h src/libstatgrab/tools.c src/saidar/saidar.c 2003-10-19 Tim Bishop Bump the version number. Hash: b960d3e979f1d8a96f08f6e532f36861aa3ebaf0 Files affected: configure.in 2003-10-19 Adam Sampson Correct comment about where dk_rbytes is available. Hash: d24ffd4a5e0a87a372a282d41753eed3b00688ef Files affected: src/libstatgrab/disk_stats.c 2003-10-19 Adam Sampson Update VALID_FS_TYPES for FreeBSD (at least, those that I can see from a quick look at src/sys). Hash: 93a730218b1093520771fae3feb961d75786bc7a Files affected: src/libstatgrab/disk_stats.c 2003-10-19 Adam Sampson Update VALID_FS_TYPES for NetBSD. Hash: 7c285a7ce4586df27fcd8db4f884837551448ce1 Files affected: src/libstatgrab/disk_stats.c 2003-10-19 Adam Sampson Implement diskio stats on NetBSD. Tested on 1.6, but should work on 1.6.1 (and give more useful output, since 1.6.1 seperates read and write statistics). Hash: d212f731bade09219a2d19a297ca4c12be41b4d6 Files affected: configure.in src/libstatgrab/disk_stats.c 2003-10-19 Adam Sampson Avoid bzero(NULL, ...) on malloc failure. Hash: dc4c6c3009b6965b05b85f55a6c5259b7bb592f1 Files affected: src/libstatgrab/disk_stats.c 2003-10-19 Adam Sampson Update the Linux VALID_FS_TYPES list based on the writable disk-based filesystems in 2.4.22 (plus xfs and jfs). Hash: 8e98a9062dbb52fe21767cdca92c93b88f170178 Files affected: src/libstatgrab/disk_stats.c 2003-10-19 Adam Sampson Remove another patch glitch. Hash: 064d9bb9ab55af10d8da212d6e392d9d7b7e48c0 Files affected: src/libstatgrab/os_info.c 2003-10-19 Adam Sampson Dear patch(1), Kindly don't insert random lines from my code into the middle of other peoples' sscanfs. love, Adam Hash: b9d221a697440905282e66a816d7fa75e399d348 Files affected: src/libstatgrab/memory_stats.c 2003-10-19 Adam Sampson Initial support for NetBSD. This adds NetBSD support for everything except diskio stats (since they're even more disturbingly complex to get at on NetBSD than the three OSs we already support). Tested against NetBSD 1.6 on i386. Hash: 21aa38b17814bcb1eb7cecf28ceeaed3b761dd24 Files affected: configure.in src/libstatgrab/cpu_stats.c src/libstatgrab/disk_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/network_stats.c src/libstatgrab/os_info.c src/libstatgrab/page_stats.c src/libstatgrab/process_stats.c src/libstatgrab/swap_stats.c src/libstatgrab/tools.c src/libstatgrab/tools.h src/libstatgrab/user_stats.c 2003-10-19 Adam Sampson Correct type of page.systime. Hash: 846e320c5b0a8544f2f457413b2da124fdac67fa Files affected: src/statgrab/statgrab.c 2003-10-19 Adam Sampson Add a helper function for opening the kvm handle. This removes a little bit of duplicated code, and means that we don't open and close kvm (which can potentially be quite expensive) each time we use it. This will also be useful for NetBSD. Hash: e5a3b852b17e7d2b6e4d2bc5c744b36578196ac9 Files affected: src/libstatgrab/process_stats.c src/libstatgrab/swap_stats.c src/libstatgrab/tools.c src/libstatgrab/tools.h 2003-10-19 Adam Sampson Fix warning when building on Linux. Hash: 440f87cd9e743d4eba487783e8e6d9b7e40a60a2 Files affected: src/libstatgrab/disk_stats.c 2003-10-19 Adam Sampson Remove headers from tools.h that the prototypes don't need (since they're included elsewhere where needed). Include tools.h in tools.c, so we get warnings if the prototypes are wrong. Hash: 79f0c1d1bb9c24f51fa58ab67d3a52955229e462 Files affected: src/libstatgrab/tools.c src/libstatgrab/tools.h 2003-10-18 Adam Sampson ... and the size parameter should be initialised to the size of the buffer first (although FreeBSD doesn't actually seem to care, NetBSD does, and the manual page says so). Hash: 2849cc62be327fd7d9633314aea4c043f4dda85b Files affected: src/libstatgrab/cpu_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/os_info.c src/libstatgrab/page_stats.c 2003-10-18 Adam Sampson Fix a little bit of slightly-confused comment formatting. Hash: 6315bb548d347daedda73995921ea07a965bbd0c Files affected: src/libstatgrab/disk_stats.c 2003-10-18 Adam Sampson You only need to call sysctl{,byname}() twice if you're actually going to do something with the size the first call returns. The last argument to sysctl{,byname}() is a size_t, not a pointer, so it should be 0, not NULL. Hash: 19c8a51fd36dac9f2986aa09c0dc23c18467e5ad Files affected: src/libstatgrab/cpu_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/os_info.c src/libstatgrab/page_stats.c 2003-10-18 Tim Bishop Update for new release - 0.6.1. Hash: 67241fe039d47b712e5e930e00ff7dbc2ec8e194 Files affected: NEWS src/libstatgrab/Makefile.am 2003-10-18 Adam Sampson Mangle device names more correctly; now a device like "/dev/vinum/foo" will become "vinum_foo", rather than "foo". Hash: c6849a7a444371b39357481d47fbafc447158b2e Files affected: src/statgrab/statgrab.c 2003-10-18 Adam Sampson Allow the user to specify the page title. Include the hostname in the page title by default. Hash: 59eb9d2f1fd3f56ea08d6e86e39f8c7c64326a83 Files affected: src/statgrab/statgrab-make-mrtg-index.in 2003-10-18 Tim Bishop Now behaves a little bit more like df with regard to percentages. This needs a better fix somewhere in libstatgrab really; we don't currently know anything about the reserved space. Hash: 152aab4035f9264e882f84f9a9f8652f672c0622 Files affected: src/saidar/saidar.c 2003-10-18 Peter Saunders Brain failure over a confusion with strncpy (thinking it worked like strlcpy) Hash: 1c50ce817c369cc852988006061e8dc41c8ecc93 Files affected: src/saidar/saidar.c 2003-10-18 Peter Saunders Fix an annoying long hostname problem. Hash: 315d45f5ac6cf73c522ddb78d06656c4fdb2d079 Files affected: src/saidar/saidar.c 2003-10-18 Tim Bishop Fix the total memory that I broke in the last commit. Hash: fbaf9351d74a5e1598a4cbceb297d052244ee52f Files affected: src/libstatgrab/memory_stats.c 2003-10-18 Tim Bishop Fix the FreeBSD memory code. The sysctl calls are returning ints, not long longs, so putting the values straight in to long longs was breaking. Now put the values into ints and then fill in the structure afterwards. This, for some reason, only showed up on FreeBSD 5.1/sparc64. The changed code works on the other FreeBSD's too. One bug still outstanding: on sparc64 the total memory isn't working. Hash: 3290e70c3d8e94a10b4c40f9336204c854d59e74 Files affected: src/libstatgrab/memory_stats.c 2003-10-16 Tim Bishop Disk percentage may be arguably more "right" than it is before. It's debatable, of course :) Hash: cb5515a184a9134daa445742346e6e7353a192fb Files affected: src/saidar/saidar.c 2003-10-12 Tim Bishop Unbodge the pkgconfig stuff. Hash: 750c414bbca9cb197942fef68c7fdfdb464603b4 Files affected: Makefile.am configure.in 2003-10-09 Tim Bishop Push version number for next release. Hash: 42b8d7009df2b377b5748a0fd706d6047207524d Files affected: configure.in 2003-10-09 Peter Saunders Fixed for freebsd 5 to count the new states a process can be in. Reverted back to the proper way for the total now this has been proven was the problem. Hash: 73b67ed366d0d5b197289479d22a7605f0e73c91 Files affected: src/libstatgrab/process_stats.c 2003-10-09 Peter Saunders Possibly making sure that the total is always correct on freebsd 5, even if some of the states are left out. Hash: 2a7c7e0bf14365fc752a42eed3620ab8b146232c Files affected: src/libstatgrab/process_stats.c 2003-10-09 Peter Saunders Another stupid mistake. Now actually prints the program name :) Hash: a09b6c211ed9d9e74072343fb9a0e0d8b55a22f2 Files affected: src/saidar/saidar.c 2003-10-09 Peter Saunders Tab problem in a fprintf and actually turn on the new command line options ;) Hash: 73c7ce44cc18d1e200e70bfa73f770637cce65f0 Files affected: src/saidar/saidar.c 2003-10-09 Tim Bishop Ready for new release of libstatgrab - 0.6. Hash: d7ba856cebb1e40a8b9e5bd0029a4f66fb132544 Files affected: AUTHORS NEWS src/libstatgrab/Makefile.am 2003-10-09 Peter Saunders Added some usage flags, and a -v for version and -h for help. Hash: 3d12d13883548c28ecf52fc473359067afb7e911 Files affected: src/saidar/saidar.c 2003-10-09 Tim Bishop Standard header, plus make it include the right curses.h dependent on what the configure system finds. Hash: d23cc9dc451ce6e878e974467508d3e9a5e3e09a Files affected: src/saidar/saidar.c 2003-10-09 Peter Saunders First release of saidar. This version works on all platforms, using ncurses fine. Bugs exist when linked against the solaris curses. (E.g. if while running saidar you hammer a key repeatedly, the screen no longer updates. This only happens with the solaris curses however) Saidar takes a single optional flag, "-d" and an argument of the delay in seconds. e.g. saidar -d 1 Will update the screen once a second (the fastest allowed update time). The default update it every 3 seconds. However, if you press any other key, it will update immidiately (unless its less than 1 second, in which case it will update at the earlist available time) Hash: df3f049cf17f66c2f800be7bc6eba308227ff95d Files affected: src/saidar/saidar.c 2003-10-09 Peter Saunders Fixed a forgotten line from the patch Hash: 749e526c41f0dae6f3b7a79dfa5d7d1b2ef52e62 Files affected: src/libstatgrab/disk_stats.c 2003-10-09 Peter Saunders Update to work for Freebsd5. Thanks to Tim Bishop for doing the hard work for this patch. Hash: 781cb270dc13de01c8986aac5c0537b0647e4caf Files affected: src/libstatgrab/process_stats.c 2003-10-09 Peter Saunders Freebsd 5 patch for disk stats. Thanks to Tim Bishop for doing the hard work on this patch. Hash: e0f048a16be6d77f9907988cf19a2a5b1aca1b4e Files affected: src/libstatgrab/disk_stats.c 2003-10-09 Tim Bishop Enable binaries being setgid kmem on FreeBSD. Will set this based on the operating system, but is overridable using a configure flag. Hash: 23d6c8df53a6760981102e03faf95600d6839c8b Files affected: configure.in src/saidar/Makefile.am src/statgrab/Makefile.am 2003-10-08 Tim Bishop Add a define for FreeBSD 5.x. Hash: 6c2f42a0f3c018da5f777d3ae89e206337adba9e Files affected: configure.in 2003-10-08 Tim Bishop Unroll Pete's commits for doing drive mappings on Solaris. It doesn't work right and he wants to start again. Also, we don't want it in the next release :) This effectively removes revisions 1.22 and 1.23. Hash: 89507a88dbd07e60135a9709609797d60d1285d4 Files affected: src/libstatgrab/disk_stats.c 2003-10-07 Tim Bishop Allow user to specify a different pkgconfig directory. Default is the sensible one (prefix/lib/pkgconfig). Main reason was that on FreeBSD they use prefix/libdata/pkgconfig, so a simple configure flag made it easier to do the port :-) Hash: 8014ec8487da374461bc65c9014344091951f300 Files affected: Makefile.am configure.in 2003-10-07 Tim Bishop Further following of the manpage: "getdevs() expects the statinfo structure to be allocated, and it also expects the dinfo subelement to be allocated and zeroed prior to the first invocation of getdevs()." This finally makes saider work on FreeBSD. Hash: c0ccec46126d2644c5dab1c4df9fcf34e6f25d27 Files affected: src/libstatgrab/disk_stats.c 2003-10-07 Tim Bishop Don't free stats.dinfo. If it used to store state between calls of getdevs it probably doesn't make sense to free it at the end of the first call of the function :) This follows Adam's last commit on this bit of which made sure we didn't reinitialise stats.dinfo every time round the loop. Hash: d6060756a465e1a139a478d689fd6d01e67f60fe Files affected: src/libstatgrab/disk_stats.c 2003-10-04 Tim Bishop Add autogen.sh, a script to run automake/autoconf/etc. This is used to build the build system when the package is checked out of CVS. Updated README.CVS files accordingly. Hash: 370ddbeb5899a4d5b0a861cf88845f16d6c718f9 Files affected: README.CVS autogen.sh 2003-10-04 Tim Bishop The new version of ncurses installs it's headers in include/ncurses. Make the prefix setting stuff aware of this. Hash: e07b6054c6572b78105bccac522d87fd49492cb7 Files affected: configure.in 2003-10-04 Tim Bishop Add all the build stuff for saidar (assuming Pete sticks with that name). The configure script will attempt to find curses, but if it can't will simply disable building of saidar (after giving a warning). Also made the building of saidar, statgrab, and the examples conditional. They're enabled by default, but can be disabled using a configure flag. Whilst I was at it, added a configure flag to disable manpage installation at configure time. I'm not sure how well the curses detection works; we've had at least one report of a problem with it. Testing will be required. Hash: 170ff78536eb7439e8aefc8b75891c4ffa73242a Files affected: acinclude.m4 configure.in docs/Makefile.am examples/Makefile.am src/Makefile.am src/saidar/Makefile.am src/statgrab/Makefile.am 2003-10-02 Tim Bishop Add a central page statgrab(3) which links all the functions together. Add a link in the See Also section of each manual page back to the central one. Hash: e646b8e22574c8b709ed24ec58845ea685f34636 Files affected: docs/Makefile.am docs/cpu_percent_usage.xml docs/get_diskio_stats.xml docs/get_general_stats.xml docs/get_load_stats.xml docs/get_memory_stats.xml docs/get_network_stats.xml docs/get_page_stats.xml docs/get_process_stats.xml docs/get_user_stats.xml docs/libstatgrab/sg_get_cpu_stats.xml docs/libstatgrab/sg_get_disk_io_stats.xml docs/libstatgrab/sg_get_host_info.xml docs/libstatgrab/sg_get_load_stats.xml docs/libstatgrab/sg_get_mem_stats.xml docs/libstatgrab/sg_get_network_io_stats.xml docs/libstatgrab/sg_get_page_stats.xml docs/libstatgrab/sg_get_process_stats.xml docs/libstatgrab/sg_get_user_stats.xml docs/libstatgrab/statgrab.xml docs/sg_get_cpu_stats.xml docs/sg_get_disk_io_stats.xml docs/sg_get_host_info.xml docs/sg_get_load_stats.xml docs/sg_get_mem_stats.xml docs/sg_get_network_io_stats.xml docs/sg_get_page_stats.xml docs/sg_get_process_stats.xml docs/sg_get_user_stats.xml docs/statgrab.xml 2003-10-02 Tim Bishop Dropped the old text documentation in favour of manpages. Hash: ae7b5a26a32e06fff0ee16cbab43acb4da52ba1e Files affected: docs/Makefile.am docs/cpu.txt docs/diskio.txt docs/load_average.txt docs/network.txt docs/os_stats.txt docs/page_stat.txt docs/process_stats.txt docs/user_list.txt docs/vm_stats.txt 2003-10-02 Tim Bishop Add final manpage - swap and memory. Hash: 0f7ae5d30c75bd836acc1b33e0f7b5b9071f58dd Files affected: docs/Makefile.am docs/get_memory_stats.xml docs/libstatgrab/sg_get_mem_stats.xml docs/sg_get_mem_stats.xml 2003-10-02 Tim Bishop Add process statistics. Hash: 4cc2c9b12abff424451f42b86f8ca6f8ae4d9c0a Files affected: docs/Makefile.am docs/get_process_stats.xml docs/libstatgrab/sg_get_process_stats.xml docs/sg_get_process_stats.xml 2003-10-02 Tim Bishop Fix some markup. Hash: 4315433d982f0d98b4ccd516da5954c38c13549a Files affected: docs/get_diskio_stats.xml docs/get_network_stats.xml docs/libstatgrab/sg_get_disk_io_stats.xml docs/libstatgrab/sg_get_network_io_stats.xml docs/sg_get_disk_io_stats.xml docs/sg_get_network_io_stats.xml 2003-10-02 Tim Bishop Add page stats manpage. Hash: b57bee93e1c6fb5180d7fdb3282d508d92429f52 Files affected: docs/Makefile.am docs/get_page_stats.xml docs/libstatgrab/sg_get_page_stats.xml docs/sg_get_page_stats.xml 2003-10-02 Tim Bishop Add user statistics. Hash: ad486b66462943036dd07b7f140ba874bfce4121 Files affected: docs/Makefile.am docs/get_user_stats.xml docs/libstatgrab/sg_get_user_stats.xml docs/sg_get_user_stats.xml 2003-10-02 Tim Bishop Add diskio stats. Anyone notice there's no documentation or examples for the disk stats? :) Hash: e5fa9e14e746548bae7044b3d1cfd0c12afb9dfb Files affected: docs/Makefile.am docs/get_diskio_stats.xml docs/libstatgrab/sg_get_disk_io_stats.xml docs/sg_get_disk_io_stats.xml 2003-10-02 Tim Bishop Add network stats manpage. Hash: 1997ac6f71ea0bea9ad679647971bbe0bd9b1dc9 Files affected: docs/Makefile.am docs/get_network_stats.xml docs/libstatgrab/sg_get_network_io_stats.xml docs/sg_get_network_io_stats.xml 2003-10-01 Tim Bishop Add CPU statistics documentation. Hash: 61409375d41f6fb4fe9f9c431d0d13a5053da51c Files affected: docs/Makefile.am docs/cpu_percent_usage.xml docs/libstatgrab/sg_get_cpu_stats.xml docs/sg_get_cpu_stats.xml 2003-10-01 Tim Bishop Add manual pages in docbook XML format. The Makefile will convert them in to manual pages at distribution time, so the archive will ship with manual pages, not XML. Hash: ca967bd6b1f06fa1dc4fa271ae1cc32f4fdd7ccd Files affected: docs/Makefile.am docs/get_general_stats.xml docs/get_load_stats.xml docs/libstatgrab/sg_get_host_info.xml docs/libstatgrab/sg_get_load_stats.xml docs/sg_get_host_info.xml docs/sg_get_load_stats.xml 2003-09-29 Tim Bishop By popular demand the next release will be 0.6 :-) Hash: 3d2030f78cbc03f25c8257240b529d6e31d09148 Files affected: configure.in 2003-09-29 Tim Bishop Seperate out the flags used to link against libstatgrab. We use them to compile the examples and statgrab. They're also in the pkg-config file to allow other app's to know which libraries they'll need. Hash: 8e77228452b3433cb3dc2a3bbbd6567204d4e29e Files affected: configure.in examples/Makefile.am libstatgrab.pc.in src/statgrab/Makefile.am 2003-09-26 Peter Saunders Bug fix on systems with large path_to_inst files. Hash: 1bd201fcab7e6ad3d0cbe399b667259f84b0a485 Files affected: src/libstatgrab/disk_stats.c 2003-09-26 Tim Bishop Add pkg-config file for libstatgrab. Hash: f664809fc156c664a49f5309f207eedd71c39fae Files affected: Makefile.am configure.in libstatgrab.pc.in 2003-09-26 Peter Saunders Added drive mapping for solaris from the old sunos names, to the more modern solaris names. E.g. ssd0 to c0t0d0s0 This is rather more useful :) Hash: 3e688b57f69c0770d6b63a7807a3a70e494b8d33 Files affected: src/libstatgrab/disk_stats.c 2003-09-09 Tim Bishop Update configure.in for next release. Hash: 4dc99ea25584253a25532cf9e61b0978626aa194 Files affected: configure.in 2003-09-09 Tim Bishop Update NEWS with latest changes. Change bug report address in README file. Update AUTHORS to include Adam as the statgrab author. Now ready for the 0.5.1 release. Hash: 50c0bf36e279a248c47a3e944f4d8deb7cb77252 Files affected: AUTHORS NEWS README 2003-09-09 Adam Sampson Fix FreeBSD segfault. From the getdevs() man page: "The dinfo subelement is used to store state between calls, and should not be modified after the first call to getdevs()." Hash: 4be02370b45bc77021a2cd2ed6df20069e8e7fa8 Files affected: src/libstatgrab/disk_stats.c 2003-08-31 Adam Sampson If invoked as "statgrab foo.", print all stats starting with "foo.". Print multiple values with the same name correctly. Hash: d08b3f759ba371a992fb8cf81c9e5faa0db2f09b Files affected: src/statgrab/statgrab.c 2003-08-29 Adam Sampson Only fetch the stats that we're actually interested in. Hash: 569e8ccaf72738c9c85ada75ddf733c775b6888f Files affected: src/statgrab/statgrab.c 2003-08-29 Adam Sampson *Really* fill in time_taken correctly. Hash: 5e1d8d69b9ca06b9eb6f59094df514a407c26251 Files affected: src/statgrab/statgrab.c 2003-08-29 Adam Sampson Fill in time_taken correctly. Hash: 8d605c085c287d892e697cc64185dc4e1e848ee4 Files affected: src/statgrab/statgrab.c 2003-08-28 Adam Sampson Make disk_stats read /proc/partitions on Linux, which contains information for all disks on recent 2.4 kernels. (It'll fall back to /proc/stat if it can't find the information there.) Hash: 4f0987de9a4e980d514b5ae0969897519f6451c6 Files affected: src/libstatgrab/disk_stats.c 2003-08-28 Adam Sampson Don't fclose(NULL). Hash: e0d1957ce23b1cdc4c4b6a8f53b375fd45d667e7 Files affected: src/libstatgrab/disk_stats.c 2003-08-28 Adam Sampson -p doesn't make any sense unless you've got stat differences. -m should work with -o. Make statgrab-make-mrtg-config use -o for CPU stats. Hash: 26f9909d7f6b3dfa5abf0cba5b7870db43bac5f5 Files affected: src/statgrab/statgrab-make-mrtg-config.in src/statgrab/statgrab.c 2003-08-28 Adam Sampson Generate statgrab MRTG scripts. Hash: ee86f1e599210cf3e7974cfd6c30631489c5c923 Files affected: configure.in 2003-08-28 Adam Sampson Add scripts to generate MRTG config and index page from statgrab output. Hash: 10f34f27ce50ed830b9a0b021cb73611856ef52c Files affected: src/statgrab/Makefile.am src/statgrab/statgrab-make-mrtg-config.in src/statgrab/statgrab-make-mrtg-index.in 2003-08-27 Tim Bishop Apply patch in bug id #10. Submitted by Adam :-) Hash: 63cbece654ed1de10e1c6a7970a9553f0a324a6f Files affected: src/statgrab/statgrab.c 2003-08-27 Tim Bishop Have to pull in the definitions from config.h. Hash: 072b364ad59aed4ea17ebe3d963f51f1f1db59b3 Files affected: src/statgrab/statgrab.c 2003-08-27 Tim Bishop Put the version number in the usage page. Hash: c434a2cda4c6d3c16d86d0d8857ef7e3a0dd3d7b Files affected: src/statgrab/statgrab.c 2003-08-26 Peter Saunders Fix for freebsd network traffic too.. Everything stores it in 32bit with the exception of SOL8+ hosts. Its a stupid world ;) Hash: cf1e2001232807d15da61ef83875c47e6195ed0f Files affected: src/libstatgrab/network_stats.c 2003-08-26 Peter Saunders Linux stores it as a 32bit unsigned long, so suffers the same wrap around bug as sol 7 hosts. This increases the chances it may happen on freebsd too so some testing maybe needed. If so, we prob should change this to a default and have a #ifdef 64bit for the odd (good) ones :) Hash: 5542af8120d71b752f9860d67831d5e746ce5a0d Files affected: src/libstatgrab/network_stats.c 2003-08-26 Tim Bishop Move the world around a bit to allow for subdirs in src. Hash: 335739628ea4dd71f16a07b6ec28af655450d0d4 Files affected: configure.in examples/Makefile.am src/Makefile.am src/libstatgrab/Makefile.am src/statgrab/Makefile.am 2003-08-26 Tim Bishop A sysctl-style program to display system statistics collected through libstatgrab. Contributed by Adam Sampson, azz@us-lot.org. Hash: 4dbed79d1992376cb3cbd31b78a1410c69bc8486 Files affected: src/statgrab/statgrab.c 2003-08-25 Tim Bishop Update version number for next release. Hash: 637d1da13e90d78f517a2c2d9c8ec5f871127324 Files affected: configure.in 2003-08-25 Tim Bishop Ready for the next release. - Update NEWS with details of new release. (FreeBSD bug fix, new docs, new examples) - Update version number to 0.5. - Update shared library version. - Move docs directory to more sensible place. Hash: f176355fd9d9a79dfccea4faa6a29f9e52f9f2eb Files affected: NEWS configure.in docs/Makefile.am src/libstatgrab/Makefile.am 2003-08-24 Tim Bishop Tidy page_stat.txt, and add the page stats stuff to the Makefiles. Hash: e37e5e9c8040d0e0854a059291e25c67c567a5ac Files affected: docs/Makefile.am docs/page_stat.txt examples/Makefile.am 2003-08-24 Peter Saunders page stats example Hash: fd6c7981825b6b1eee077db441d62b174b95bad5 Files affected: examples/page_stats.c 2003-08-24 Peter Saunders Page stats Hash: bd1a5106694f4fa79bafca244a38900672ab8d40 Files affected: docs/page_stat.txt 2003-08-24 Tim Bishop Tidy cpu.txt and add to Makefile. Hash: eeb561658625dc7d5d60bc7cc4e08c8c1ab04124 Files affected: docs/Makefile.am docs/cpu.txt 2003-08-24 Peter Saunders CPU documentaion Hash: c134cc37db834c8ea30a9717f32fdfa87e03a324 Files affected: docs/cpu.txt 2003-08-24 Tim Bishop Tidy user_list too. Hash: 14e83ce8301d21a4a33cffdbdaee633eff9b24e9 Files affected: docs/Makefile.am docs/user_list.txt 2003-08-24 Tim Bishop Tidy up of lots of little things. :) Hash: a427805c2cf694be14b4be8b8c11d693dfbe56d4 Files affected: NEWS README docs/Makefile.am docs/diskio.txt docs/load_average.txt docs/network.txt docs/os_stats.txt docs/process_stats.txt docs/vm_stats.txt examples/Makefile.am examples/cpu_usage.c examples/disk_traffic.c examples/load_stats.c examples/network_traffic.c examples/os_info.c examples/process_stats.c examples/user_list.c examples/vm_stats.c src/libstatgrab/Makefile.am src/libstatgrab/cpu_stats.c src/libstatgrab/disk_stats.c src/libstatgrab/load_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/network_stats.c src/libstatgrab/os_info.c src/libstatgrab/page_stats.c src/libstatgrab/process_stats.c src/libstatgrab/statgrab.h src/libstatgrab/swap_stats.c src/libstatgrab/tools.c src/libstatgrab/tools.h src/libstatgrab/user_stats.c 2003-08-24 Peter Saunders User docs Hash: 36359be6ae20aa3d653547c549def0ea8066a2cd Files affected: docs/user_list.txt 2003-08-24 Peter Saunders User details example. Hash: b96b633768607f71207ed90f9e136e3d461641b4 Files affected: examples/user_list.c 2003-08-24 Peter Saunders Documentation for memory and swap stats. Hash: 69fda15612999cb8b6364c7c262937e26e57d0fa Files affected: docs/vm_stats.txt 2003-08-24 Peter Saunders Memory and swap stats example Hash: eef8ccdbf9dec6ed5030abfae50dcc013f0b9644 Files affected: examples/vm_stats.c 2003-08-24 Tim Bishop The AUTHORS file has been here since it was copied from ihost ;) Hash: b33a5157c60f889ae124a18b77f457e2af6382a1 Files affected: AUTHORS 2003-08-24 Tim Bishop Add latest docs and examples. Hash: 224bb6e0223a85e42c0e68f9dde8ff94d66ebafe Files affected: docs/Makefile.am examples/Makefile.am 2003-08-24 Peter Saunders os_stats docs Hash: 976c2ba691e0a50ff026036d2c291be7007b3783 Files affected: docs/os_stats.txt docs/process_stats.txt 2003-08-24 Peter Saunders OS stats example Hash: 2604220f4f9d8f928e745fef16d1d42896431295 Files affected: examples/os_info.c 2003-08-22 Peter Saunders Basic process_stats documentation Hash: b50eafa6b2079c6932dfd7b4d5f31dca9aac47f8 Files affected: docs/process_stats.txt 2003-08-21 Peter Saunders Added a process stats example. Hash: 34156158e9e0315a3319aeaadd6d27ff27322c8f Files affected: examples/process_stats.c 2003-08-21 Tim Bishop Add the load stats to the Makefile. Hash: db542ba9abf16518e42c7443268ca51f170bfa9f Files affected: docs/Makefile.am examples/Makefile.am 2003-08-21 Peter Saunders Added load_average examples and documentation. Hash: 7f2d563bd166a90c0cee72963ad2eb5b23513587 Files affected: docs/load_average.txt 2003-08-21 Peter Saunders Added load_stats example, and documentation. Hash: 4e1bb4fd7593764ab1eecb61a7f9f75fe6758a07 Files affected: examples/load_stats.c 2003-08-21 Tim Bishop Bug reporting address is now bugs@i-scream.org. Hash: d55004d7d8d251ef1e26e48bc8f6057645132d24 Files affected: configure.in 2003-06-05 Tim Bishop Add new examples to Makefile. Hash: 66a8171796b7215a1432a80e5d081074575e9d78 Files affected: examples/Makefile.am 2003-06-05 Tim Bishop Proof read and slightly alter diskio.txt and network.txt. Also add diskio.txt to the Makefile. Hash: 51f8568de18fa8925ac6f0798a9deb9a994ac368 Files affected: docs/Makefile.am docs/diskio.txt docs/network.txt 2003-06-05 Peter Saunders Example for disk traffic. Hash: 0f42c8d70b0e19856da85616368b46b01dc0b45b Files affected: examples/disk_traffic.c 2003-06-05 Peter Saunders Example of how to get and display cpu usage. Hash: 7640aaa1f7cc2a32ecad27e5a01c533ade74ba66 Files affected: examples/cpu_usage.c examples/network_traffic.c 2003-06-04 Peter Saunders Diskio doc's... Prob needs some serious proof reading :) Hash: 34b31bcdee61375b1e3dc788b9659f1c18e45d74 Files affected: docs/diskio.txt 2003-06-04 Peter Saunders Fix bug report #748942. Moved the ifdef to where it should be :) Hash: b8ee214293ebd60610e48d8ed8686921af8e5b60 Files affected: src/libstatgrab/process_stats.c 2003-05-20 Tim Bishop Added building of examples. We don't, currently, install them though. Hash: 4199dceb902fcd195081bfb64837d10ab1f38610 Files affected: Makefile.am configure.in examples/Makefile.am 2003-05-20 Tim Bishop Change i-scream.org.uk to i-scream.org. Hash: cdc929df499d3f20cf3cb2e8086cb26a7fad8f93 Files affected: AUTHORS Makefile.am README README.CVS configure.in docs/Makefile.am 2003-05-20 Tim Bishop Allow documentation to be installed to $(datadir)/libstatgrab/docs. Hash: 57c123bfd9dddd09b904c54d55f66f84d8973d81 Files affected: Makefile.am configure.in docs/Makefile.am 2003-05-12 Peter Saunders Typo fixed, added another bug Hash: 881a7879f462ec3571ca955f165cb1fda6cab8be Files affected: docs/network.txt 2003-05-11 Peter Saunders Added basic docs for network stats, and a example. Needs some basic work, and no doubt several typos :) Hash: 7e2f8bdb51afb64700445b93b34864e89eabffcb Files affected: docs/network.txt examples/network_traffic.c 2003-04-09 Tim Bishop Increment for next release. Hash: e860d96c9cd2abd7ea9cebb1cd3241f53df41494 Files affected: configure.in 2003-04-09 Tim Bishop Version 0.4 now with FreeBSD support. Hash: cc3664992ccc7cc5b84d0e55a3afebacf95900b6 Files affected: NEWS src/libstatgrab/Makefile.am 2003-04-09 Tim Bishop Add the standard header. Particularly the bit about including config.h was needed to allow the ifdef around the last function to work. Hash: f1ffd15a963a0a427f014b60003491b1ead0c86a Files affected: src/libstatgrab/tools.c 2003-04-09 Tim Bishop libstatgrab needs to do a check for atoll too. This should fix libstatgrab on all platforms. New release coming shortly ;) Hash: 19370f8e8119fde78d15ee3aff98b3248d26f5d7 Files affected: NEWS configure.in 2003-04-06 Peter Saunders Added a library to link against on freebsd so that it will compile. Hash: 2c208011d1ef5849d2a434c3dabed4ad9306f059 Files affected: configure.in 2003-04-06 Peter Saunders Make the functions that use atoll have a #ifdef HAVE_ATOLL around them. I did this because freebsd doesn't have this function, and it doesn't need to run any of the functions in tools.h that uses them. Hash: 2591b93c5691da53fc062e843f5d7d9e972ef3e6 Files affected: src/libstatgrab/tools.c src/libstatgrab/tools.h 2003-04-06 Peter Saunders Now works on freebsd. This is the last of parts that needed to be ported so its now "finished" for testing. Solaris and Linux should also be tested as minor changes in code may of disturbed them (it shouldn't have, i just may of made a mistake :) ) Certain things will require setgid kmem permissions (swap and processor stats) Hash: 0d0cd7d55207da824ceb0d531a35c1db618a063e Files affected: src/libstatgrab/network_stats.c 2003-04-05 Peter Saunders Should now work on freebsd. Hash: eb713b48e3e3651cbec64f6ad4162ff4ecc642f7 Files affected: src/libstatgrab/disk_stats.c 2003-04-05 Tim Bishop Next release of libstatgrab will (hopefully) have FreeBSD support, and will therefore be version 0.4 I guess. Hash: cc386a731bcc75d737d65eaa8a037fb47330ee1e Files affected: configure.in 2003-04-04 Peter Saunders Disk stats for freebsd. This does not currently include diskio stats. Hash: 9c05b660e4ff9496ee34e951e3deffa3b2d146cc Files affected: src/libstatgrab/disk_stats.c 2003-04-04 Peter Saunders Ported to work onto freebsd. Hash: 8c90f2265ccbdd3bedbdcf46f80de9ca4845be2e Files affected: src/libstatgrab/statgrab.h src/libstatgrab/user_stats.c 2003-04-04 Peter Saunders Now works on freebsd Hash: 8bdad32081a654dfda0bcd3c8dd5ffe95c97b026 Files affected: src/libstatgrab/swap_stats.c 2003-04-03 Peter Saunders Now works on freebsd.. Now why couldn't they follow the same scheme as everything else :) ? Hash: dd36536b70419a3dacbdef66bb58997ac57661e8 Files affected: src/libstatgrab/process_stats.c 2003-04-03 Peter Saunders Now works on freebsd. Hash: 3a502e95eda09826cc6dc6629193b08843d582cc Files affected: src/libstatgrab/page_stats.c 2003-04-03 Peter Saunders Now works on freebsd Hash: 930738aaffd0ee09e255a7220c0207825bdee7dc Files affected: src/libstatgrab/os_info.c 2003-04-03 Peter Saunders Should now work happily on freebsd. sysctlbyname seems to return a lot of things in long's. Im not completely trusting this code, but it does appear to work, and its the same as the old implementation. Hash: fc48e74b6e5d86db230263150a07ca22960d495a Files affected: src/libstatgrab/memory_stats.c 2003-04-03 Peter Saunders Freebsd support. Smile tim ;) Hash: d895f0c3b968e65974c658522d93a1b629fc8efe Files affected: src/libstatgrab/cpu_stats.c 2003-03-31 Tim Bishop Update version for next release. Hash: c93f65bd652065a72adaaabc531f31a2acad75c5 Files affected: configure.in 2003-03-31 Tim Bishop Package up 0.3.4 which fixes some leaking linux issues :-) Hash: d89fe67fed37469f6f48bef5db96cd3b05e94a8f Files affected: NEWS src/libstatgrab/Makefile.am 2003-03-31 Peter Saunders Fixed memory leak in regex stuff Hash: ffaddaf6a5a20d4c81e16f87706eb3b4e0c65785 Files affected: src/libstatgrab/network_stats.c 2003-03-31 Peter Saunders Fixed some issues with not closing FILE*'s. Hash: f92e8369f81e74178a167a1679c18a32fffe29a8 Files affected: src/libstatgrab/cpu_stats.c src/libstatgrab/disk_stats.c src/libstatgrab/network_stats.c 2003-03-29 Tim Bishop Fix another #include. Hash: 121e9bf7810f622808a9b8f004a0378a8b12c119 Files affected: src/libstatgrab/network_stats.c 2003-03-22 Tim Bishop Update version for next release. Hash: 4cd2885367310506a2ab83c6a74dcbbe8fe881c7 Files affected: configure.in 2003-03-22 Tim Bishop Version 0.3.3. Bug fixed in the wraparound code. Hash: 9e937186404b0fc2eefac411e517bc5bd39bacdb Files affected: NEWS configure.in src/libstatgrab/Makefile.am 2003-03-22 Peter Saunders Another stupid bug in the wrap around code. Hash: 778fa7a1fc27fef42d99a617602e36723833f760 Files affected: src/libstatgrab/network_stats.c 2003-03-21 Tim Bishop Update the shared library version number too. Hash: ac6c73b7aca572b457b5a174d2538cd3af2d4b8f Files affected: src/libstatgrab/Makefile.am 2003-03-21 Tim Bishop Once again, heading for 0.4. If Pete manages to not find any more bugs :-) Hash: 819e90f9b9b7687e5ca0a198c226072fce8870be Files affected: configure.in 2003-03-21 Tim Bishop Version 0.3.2. Has fixed wraparound stuff, well tested by now :-) Hash: b4740fd83c5db1bef21351f972d7c6aca4ff209f Files affected: NEWS configure.in 2003-03-12 Peter Saunders Well, i carefully made the function to look after wrap around issues, and then apparently didn't use it :) It now uses it :) Hash: de6405ade97a1c9d3c3cb8e26ad7c0a41143789d Files affected: src/libstatgrab/network_stats.c 2003-03-12 Tim Bishop Bump shared library version for 0.3.1. Hash: 9680741565c3202938a720b2b0c181d741607009 Files affected: src/libstatgrab/Makefile.am 2003-03-12 Tim Bishop Hopefully heading towards 0.4 with FreeBSD support :-) Hash: 3e50d20070b2b39a833f3947c3378fdaef07f84a Files affected: configure.in 2003-03-12 Tim Bishop The configure setup explicitly checks for Solaris versions older then 8, and sets a define so the code knows not to use 64bit values. Also updated the NEWS file, bringing about version 0.3.1. Hash: 2317d93cb7a90878d1a002b76c98c2319699eb92 Files affected: NEWS configure.in 2003-03-11 Peter Saunders Ok, wrap around fixed for 32bit machines, not 64. I really ought to change all the long long's to ulong long's. I'll ponder if i can be bothered :) Hash: 98492c4ee7ece6c68bc15bc758fb78b6f0f5acb0 Files affected: src/libstatgrab/network_stats.c 2003-03-11 Peter Saunders Make network stats work on pre sol8. BUGS: On pre sol8 systems, it doesn't cope with a wrap around once the 32bit uint becomes too big. So when this happens it will report one set of dodgy data, then continue. This bug technically is there in the 64bit version too, but it will need to of sent 9223372036854775808 bytes first. (8388608 terrabytes, so basically a *big enough* number that will come around and byte me in 20 years time or something ;) ) Hash: 84c8e6378eeace37ff25af7e27a5c40536508810 Files affected: src/libstatgrab/network_stats.c 2003-03-11 Peter Saunders Bug fix, again :) .. I wasn't reporting the time taken since last statgrab correctly. So got very busy disks apparently ;) Hash: 375eee85221bc0fa043bd26d4acdb63b1a5ebee8 Files affected: src/libstatgrab/disk_stats.c 2003-03-10 Peter Saunders Think i've fixed another bug which causes seg faults on machines with no users :) Hash: 022f44a44c1188eab0b4506bf84ae7b6493dbc59 Files affected: src/libstatgrab/user_stats.c 2003-03-10 Tim Bishop Increment version numbers so we're working towards the next versions... Hash: 8af77e02c9c5cc73d54109941349b427085a5e9d Files affected: configure.in 2003-03-10 Tim Bishop libstatgrab now has linux support and goes to version 0.3. ihost has only minor bugfixes and changes, so becomes version 1.5.1. NEWS files updated accordingly. libstatgrab shared library version numbered incremented using the libtool rules - under the assumption that someone must have thought about that idea, which is more than we can manage to do ;) Hash: 589384f499fa026e5ba01fffe168af52240db73c Files affected: NEWS src/libstatgrab/Makefile.am 2003-03-07 Tim Bishop Added tools.c and tools.h to the Makefile. It now compiles ok on both Solaris and Linux. Also fixed a minor compile bug in disk_stats.c - I did check the history in CVS, and it used to be like this. The bug got introduced in the Linux changes. Hash: 57112430828f34c075ef37eb5420cf32e951db94 Files affected: src/libstatgrab/Makefile.am src/libstatgrab/disk_stats.c 2003-03-07 Peter Saunders Made work with linux. Last thing that needs to be ported. Hash: b81524e06267dc4743ae18c3917c22060a736278 Files affected: src/libstatgrab/swap_stats.c 2003-03-07 Peter Saunders Added linux support. Hash: 005e59dcbcdb53c12f62bc9e89f154f856d6b907 Files affected: src/libstatgrab/process_stats.c 2003-03-07 Peter Saunders Removed getting of some data we didn't really need or use. Updated page_stats to work with linux. Fixed tools.h to compile nicely :) Hash: c6c14d07c5dc399abd5542f808f9e5b6cc6aa599 Files affected: src/libstatgrab/page_stats.c src/libstatgrab/statgrab.h src/libstatgrab/tools.h 2003-03-07 Peter Saunders Made it work with linux :) Hash: c2c9347cc43f1fc6a767b3e7faa22eaaea278a4c Files affected: src/libstatgrab/os_info.c 2003-03-07 Peter Saunders Made network stats work with linux. Hash: 37daf15289de257cbac7387d78633450bdab311c Files affected: src/libstatgrab/network_stats.c src/libstatgrab/tools.c src/libstatgrab/tools.h 2003-03-05 Peter Saunders Updated Memory stats to work with linux. Hash: 3068e91a69c3216527f0bca7774ac8de2ec56dcd Files affected: src/libstatgrab/memory_stats.c 2003-03-05 Peter Saunders Linux reports stupid results. Fixed to return real vaules. Side note, gkrellm is doing it wrong ;) Hash: dd466679e976eda0e3b76707b60e4871d51aa251 Files affected: src/libstatgrab/disk_stats.c 2003-03-05 Peter Saunders Working linux diskio stats. Fixed bug in tools.c Hash: 58b451133bddfe84b54602e21905d78471891aae Files affected: src/libstatgrab/disk_stats.c src/libstatgrab/tools.c 2003-03-04 Peter Saunders Useful tools, currently only one function. Function takes a file pointer and will read threw it until it hits a passed string. It will return that line. Hash: 995b00cb8e0fe22e1ee0fd89350d3f6c5e18574d Files affected: src/libstatgrab/tools.c src/libstatgrab/tools.h 2003-03-04 Peter Saunders Diskio stats for linux. Not been checked. Relies on tools.c (seperate comit) If someone knows a nicer way of getting the device name, please tell me, as the way im doing it is horrible! :) Hash: e7ec5c8932a20f22ad4859b123bf75210d9fbe31 Files affected: src/libstatgrab/disk_stats.c 2003-03-04 Peter Saunders disk_stats for linux. Does not do diskio stats yet. Hash: c39139ef8b828e4bbea96979e0c5d67d44e62de4 Files affected: src/libstatgrab/disk_stats.c 2003-03-03 Tim Bishop Update version numbers. It seems to make sense to increment version numbers just after a release. Then you're working towards the next version... Hash: 39a695a2e54409c17315bb82996c5cf6c0679cc7 Files affected: configure.in 2003-03-03 Peter Saunders Added linux support for cpu stats Hash: 375144386f274b3746e98c5ee20b170fbaa7f7f8 Files affected: src/libstatgrab/cpu_stats.c src/libstatgrab/statgrab.h 2003-03-03 Peter Saunders Removed headers that were not used. Hash: f0577346c6b189552c3bcbbbad7a2956b9f035be Files affected: src/libstatgrab/cpu_stats.c 2003-03-03 Tim Bishop Update NEWS and README files. We now have version 0.2 of libstatgrab! Hash: 9ecf0aae35004ca6d5a0c2ddfca53d2d30f7513b Files affected: NEWS README 2003-03-03 Peter Saunders Made cpu stats to a type a bit more cross platform :) Hash: 41551cdae892f5527834e6216203125ae7f16002 Files affected: src/libstatgrab/cpu_stats.c src/libstatgrab/statgrab.h 2003-03-03 Tim Bishop And we have 0.2 :-) Hash: 0b3b23dc59123368784e88668a795fe6ca88e8e4 Files affected: configure.in 2003-03-02 Peter Saunders Removed debugging statements Hash: 78218eaa898a30615b8feba1b62a89015888d921 Files affected: src/libstatgrab/user_stats.c 2003-03-01 Peter Saunders Bug fix : Hash: 2c68891f52c145d7f6ea99269b12b9da31dd1a7d Files affected: src/libstatgrab/process_stats.c 2003-03-01 Peter Saunders changed user_stats to return something more useful for ihost, and prob something more useful to everyone else too. Although, they can't just itterate thru it now, they got to find ' ' :) Hash: bc17be01a255fbdfe6d132cb37db1370b3cde894 Files affected: src/libstatgrab/statgrab.h src/libstatgrab/user_stats.c 2003-03-01 Peter Saunders bug fix Hash: c84116e1acfa6af605d3dfb594d78f84fb611969 Files affected: src/libstatgrab/network_stats.c src/libstatgrab/user_stats.c 2003-03-01 Peter Saunders Bug fix Hash: 2b80862df1521d271b6fc9f88df8411329e33dd3 Files affected: src/libstatgrab/disk_stats.c 2003-03-01 Peter Saunders Removed debugging printf Hash: f3584b43bdb7b51cb80d56e93bb9099a93189ea6 Files affected: src/libstatgrab/process_stats.c 2003-02-28 Tim Bishop Typo which meant the network stats code wasn't being compiled in to the library. Opps :-) Hash: 48b63afb0799c135e908c2808520d93514afa2c1 Files affected: src/libstatgrab/Makefile.am 2003-02-28 Tim Bishop Tidy up of configure script, and includes. Hash: a6f6e7a70ae67d4a7a4a50ad14ec3f098c489167 Files affected: configure.in src/libstatgrab/cpu_stats.c src/libstatgrab/disk_stats.c src/libstatgrab/load_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/network_stats.c src/libstatgrab/os_info.c src/libstatgrab/process_stats.c src/libstatgrab/user_stats.c 2003-02-23 Peter Saunders Changed function name changed to be consistent. Hash: 05b8f8796c4776742bb51a81184b19a6d83967d9 Files affected: src/libstatgrab/disk_stats.c src/libstatgrab/statgrab.h 2003-02-23 Peter Saunders Added a diff diskio_stats and fixed a bug. This is the last thing needed for the solaris version of the new libstatgrab, bar bug fixes. Hash: 67b33f8cfcc5c7261418049b4c190d0c7ebef6d3 Files affected: src/libstatgrab/disk_stats.c src/libstatgrab/statgrab.h 2003-02-23 Peter Saunders Added support for read/write stats on a per disk basis. This does not count metadisks as disks. I will also add io transfer for mounted devices, and the ususal diff() function that gives you the differences since last time you called it. Hash: 3b7d3f8fbaaff7d2a639736657b667b1aa5d55bd Files affected: src/libstatgrab/disk_stats.c src/libstatgrab/statgrab.h 2003-02-20 Tim Bishop Removed references to ukcprog.h. Fixed a missing * in the disk stats. And removed a block of linux stuff that shouldn't have been there :-) All with Pete's approval, of course. Hash: 306cf982e2eaa0bba1d15d11b76fcf4b1f6c1465 Files affected: src/libstatgrab/cpu_stats.c src/libstatgrab/disk_stats.c src/libstatgrab/load_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/swap_stats.c src/libstatgrab/user_stats.c 2003-02-20 Peter Saunders Header for new function. Hash: 7db6465bb97b854a7e2eac782c18035dafde850a Files affected: src/libstatgrab/disk_stats.c 2003-02-19 Tim Bishop Created the structure and automake stuff for the source files to be moved to a src subdirectory. This will break things until I repo-move the actual files, which I don't want to do until Pete is happy :-) Hash: 5210db6e48a4c6edb6b08e9ead045ac4e9ea86cb Files affected: Makefile.am configure.in src/libstatgrab/Makefile.am 2003-02-19 Tim Bishop Specified the version number. Not that I really understand them though, libtool seems a little confusing ;) Hash: abc1b601a3cb35a2bbe245cf23a6703bf6f7e257 Files affected: Makefile.am 2003-02-19 Tim Bishop We now use libtool to build libstatgrab. This gives us static and shared versions of the library, which is nice :) Updated the CVS build instructions accordingly. Hash: 4a8cbb657a698fd411da8cf08566208a835545a5 Files affected: Makefile.am README.CVS configure.in 2003-02-19 Peter Saunders network stats now returns a diff() style function, to make it easy to show the exact average network traffic over a period of time. Hash: 0dfb06e924fef53b333a843338b93eafec42e60d Files affected: src/libstatgrab/network_stats.c src/libstatgrab/statgrab.h 2003-02-19 Peter Saunders Added get_page_stats_diff() which returns the number of pages in/out etc since last time it was called, and the time difference since last time it was called. This makes it very easy for a host to know how many pages averaged over a period of time. Hash: 9d0b82033e6a8a934562eb69a85806c0a24da209 Files affected: src/libstatgrab/page_stats.c src/libstatgrab/statgrab.h 2003-02-18 Peter Saunders Changed the kstat_close to not return NULL in event of a failure. If we cant close it, well there is nothing i can do about that, so i may as well at least return something useful since its done all the hardwork by that point. And anywan, it should never fail to close :) Hash: 02c6ced0bb612526b9d76c72f78a7986b2849657 Files affected: src/libstatgrab/cpu_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/network_stats.c src/libstatgrab/os_info.c 2003-02-18 Peter Saunders Finished page stats. It returns 2 things. One, number of pages swapped in and out, 2, the number of pageins and pageouts. As to if this is actually correct or not, im not 100% sure, but tests seem to imply it is. from: http://www.sun.com/sun-on-net/itworld/UIR960901perf.html ulong pgin; /* pageins */ ulong pgpgin; /* pages paged in */ ulong pgout; /* pageouts */ ulong pgpgout; /* pages paged out */ ulong swapin; /* swapins */ ulong pgswapin; /* pages swapped in */ ulong swapout; /* swapouts I am *not* using swapins and swapouts. I did this in the orginal libstatgrab, and it didn't work. Looking at it more closely, it always seems to have 0 in it, so my guess is its broke. :) Hash: 6032ea5dca0e6ec99c5b187c314d2da7c555566f Files affected: src/libstatgrab/page_stats.c src/libstatgrab/statgrab.h 2003-02-18 Tim Bishop Autoconf/Automake setup. README.CVS details how to "get started" from a CVS checked out copy. Then it's just the usual configure and make, as described in the README file. Hash: 2fe77ba447f0657f8af60240b2b75af382a13d39 Files affected: AUTHORS Makefile.am NEWS README README.CVS configure.in 2003-02-18 Peter Saunders The new revesion of libstatgrab, which is a complete rewrite essentially. Firstly the data is now returned in structures rather than xml strings. The structures returned are all static, so what ever calls the library doesn't have to deal with the memory management of it. Secondly the general efficency of the code is now significantly faster. It no longer needs to fork a process, connect file descriptors and run ps, and then parse the output like it used to. Now it walks /proc and reads it into the correct data structures. This works without needing any special privilages, so it can still run as a normal mortal without needing any special group. (Freebsd will be an exception to this, but this commit only works with solaris, and that requires nothing special) Thridly it has more functionality than it used to. It not for instance is capable of showing network traffic stats, (although its not completely finished yet). It also in the near future be able to disk io stats as well. Several bug fixes have been aplied over the original version. For example the cpu_stats used to only reply the stats for the first processor. This now will report the total stats of all of them. Paging stats will also be fixed, but haven't been done yet. Hash: 1b1f8a82d406263f3e4eb4ee5e0e918b4efcd25b Files affected: src/libstatgrab/cpu_stats.c src/libstatgrab/disk_stats.c src/libstatgrab/load_stats.c src/libstatgrab/memory_stats.c src/libstatgrab/network_stats.c src/libstatgrab/os_info.c src/libstatgrab/page_stats.c src/libstatgrab/process_stats.c src/libstatgrab/statgrab.h src/libstatgrab/swap_stats.c src/libstatgrab/user_stats.c libstatgrab-0.90/NEWS000644 001750 001750 00000023502 12200025312 014400 0ustar00tdbusers000000 000000 libstatgrab NEWS http://www.i-scream.org/libstatgrab/ PLANS: We're now working towards a 1.0 release which is where we plan to stabilise the API. We'll be doing test releases before hand, but as always we'll like to hear about any bugs found in the current release. libstatgrab 0.90 * Please note the API in 0.90 has changed, so applications using libstatgrab will need to be updated to support the changes. * Thread safety and reentrant functions. * API unification (every stats call is now able to return multiple entries). * Complete rewrite of internal memory management (eases future extensions). * Add experimental support for tracing using log4cplus. * Complete the ports for AIX, HP-UX and most of the widely used BSD-based operating systems. * Complete the port for Darwin/MacOS X including basic Mach. * Clean up the FreeBSD and Solaris implementations. * Remove explicit support for Linux 2.4. libstatgrab 0.17 (21 February 2010) * Provide iowait cpu information on Linux version 2.5.41 or later. * Display data for ZFS on Solaris. * Dynamically get list of valid filesystems on FreeBSD. (Thanks to Baptiste Daroussin) * Support FreeBSD 9. * Use utmpx when available (required for FreeBSD 9). (Thanks to Ed Schouten) * Support larger amounts of memory on FreeBSD. (Thanks to Tom Bird) libstatgrab 0.16 (13 March 2008) * Fix saidar build on Solaris with Sun's compiler. * Add support for FreeBSD 8.0. * Fix build on "armel" Debian port. (Thanks to Riku Voipio and Martin Guy) * Fix statgrab-make-mrtg-config on machines with no swap. (Thanks to Tom Carlson) libstatgrab 0.15 (14 July 2007) * Fix breakages in memory stats on OpenBSD that were introduced in the last release. (Thanks to David Love) * Update internal string functions and some related cleanups. (Thanks to David Love) * Fix compile warning on FreeBSD. libstatgrab 0.14 (08 January 2007) * Fix memory stats on OpenBSD. * Add colour support to saidar. (Thanks to Angelina Carlton) * Fix CPU stats on Solaris - swap and iowait were incorrectly reported. * Fix kstat related memory leaks on Solaris. (Thanks to Javier Donaire) * Fix network stats on some unusual Solaris setups. * Fix process time_spent on Linux. (Thanks to Fred Barnes) * Make interface up status check the link status as well. (Thanks to Michelangelo Vassallo) * Fix build on NetBSD 3. (Thanks to Wijnand Wiersma) * Rework curses detection code in the configure script. * Fix bug that caused saidar to crash when the window was rapidly resized. libstatgrab 0.13 (19 March 2006) * Fix build problems with recent linux kernels. * Make saidar truncate disk/inteface/mount names to fit in display. * Add WIN32 support using MINGW (not widely tested). * Fix network interface up/down status on Solaris. * Add extern "C" to header file to make linking with C++ code easier. * Fix statgrab to cope with filesystem paths containing dots. * Make NFS a legal filesystem type on all platforms. * A few minor build fixes. libstatgrab 0.12 (31 July 2005) * More details added to filesystem statistics. (Patches provided by Roman Neuhauser) * Rework Linux partition detection. * Fix compile error in network stats on Linux 2.6. (Patches provided by Scott Lampert) * Change name of duplex value in network interface stats. NOTE: this minor change breaks the API. * Manual pages for saidar, statgrab and the other tools. * Fix minor typo in statgrab usage output. * Support for Solaris 10. * Support for FreeBSD 7. libstatgrab 0.11.1 (03 March 2005) * Add NFS to list of supported filesystems. * Fix reporting of network interface duplex settings on Linux. * Fix saidar to support negative FS usage. libstatgrab 0.11 (09 November 2004) * Add support for HP-UX 11.11. (Patches provided by Roy Keene) * Minor fixes to statgrab mrtg tools. * Minor fixes to saidar. * Minor code cleanups and fixes to libstatgrab. libstatgrab 0.10.3 (24 August 2004) * Add -f flag to statgrab to display floating-point numbers multiplied by an integer. * Add -K, -M and -G flags to statgrab to show byte counts in kibibytes, mebibytes or gibibytes. * Make statgrab-make-mrtg-config use the new flags to scale extremely large or small numbers so that mrtg can handle them. * Make statgrab-make-mrtg-config automatically detect network interface speeds. * Add support for FreeBSD 6.0-CURRENT. libstatgrab 0.10.2 (27 July 2004) * Fix shared library version that when backwards in 0.10.1. libstatgrab 0.10.1 (26 July 2004) * Use DESTDIR correctly when setting permissions at install time. * Fix disk stats to work with OpenBSD 3.5. * Fix disk stats on NetBSD 2.0 (statvfs instead of statfs). * Fix memory leak in process stats on NetBSD 2.0. * Add vxfs (Veritas filesystem) to list of known filesystems on Solaris. * Add more variables to the pkg-config file to suggest suitable ownership and permissions for binaries using libstatgrab. * Make sure statgrab.h can safely be included twice. * Fix statgrab to display network interface names even if they don't have IO stats (like the loopback interface on Solaris). * Add error reporting function that grabs errno. libstatgrab 0.10 (20 May 2004) * All function and structure names now follow a standardised naming scheme. This will break compatibility with existing programs. To use pre-0.10 compatibility functions: #define SG_ENABLE_DEPRECATED #include * New process stats function added to provide full details on currently running processes. See sg_get_process_stats for details. * Compare functions provided for process, network, and disk io statistics. These can be used with qsort. * Error reporting functions added. See sg_get_error and associated functions. * Support added for NetBSD 2.0. * Lots of code tidying. * Python bindings now exist in a separate package: http://www.i-scream.org/pystatgrab/ libstatgrab 0.9 (10 March 2004) * Added network interface information: speed, duplex, up/down. * Added more statistics on network interfaces: i/o packets, i/o errors, and collisions. * Added support for OpenBSD 3.3. * Added support for DragonFly BSD 1.0. * No longer need elevated privileges on most platforms: FreeBSD 5, NetBSD, and OpenBSD. (see PLATFORMS file for details on which OS's need elevated privileges) * Minor changes to the return types of the python bindings functions. * PLEASE NOTE: this will break binary (only) compatibility. libstatgrab 0.8.2 (11 February 2004) * Fixes to add support for Solaris 6. * Python bindings available in extras directory. * Some tidying up of code. libstatgrab 0.8.1 (21 January 2004) * The library part of libstatgrab is now released under the LGPL. (the tools are still released under the GPL) * File descriptor leak fixed on Linux. * strlcpy/strlcat functions added for Solaris 7 to fix compile. * statgrab_init error behaviour fixed (primarly for Solaris 7). * Some incorrect #includes moved. * Significant speed increases to the Solaris disk mapping code in statgrab_init, which improves startup time. * Minor fix for saidar's -d flag and negative numbers. libstatgrab 0.8 (06 January 2004) * Support for Linux 2.6. * Support for Cygwin. * Use cNtNdNsN names on Solaris instead of sdN. * Fixes and optimisations to saidar. * Fixes to the --disable-saidar and --disable-statgrab configure flags. * New function to drop elevated privileges some OS's require. (after using the init function) libstatgrab 0.7 (22 October 2003) * Support for NetBSD 1.6.x. * FreeBSD code optimised. * Initialise function allows programs to drop extra privileges (on *BSD). * saidar now works even if it can't get all statistics. * List of known file systems increased on Linux and *BSD. * Minor bug fixes. * Tested (and working) on Solaris 9 x86, Linux 2.2 on alpha, and Linux 2.4 on amd64. libstatgrab 0.6.1 (18 October 2003) * Support for FreeBSD 5.1/sparc64. * Bugs fixed in FreeBSD memory statistics. * saidar displays disk percentages more "correctly". * Bug fixed displaying hostname in saidar. * statgrab now handles unusual /dev layouts more gracefully. * Minor packaging changes. libstatgrab 0.6 (09 October 2003) * saidar, a curses-based tool, has been added to give an overview of the current system statistics. * Added support for FreeBSD 5.1. * Documentation is now available in manpages. * Fixed major bug in the FreeBSD diskio stats. * Added a .pc file for pkgconfig. libstatgrab 0.5.1 (09 September 2003) * Network stats wrap-around bug fixed on Linux and FreeBSD * Linux now reads disk information from /proc/partitions if available. This results in it getting data for all the disks. * An additional tool, statgrab, has been added to allow external programs to easily parse statistics generated by libstatgrab. * Scripts to generate MRTG (www.mrtg.org) configs with statgrab have been added. This allows graphs to be generated from system stats. libstatgrab 0.5 (25 August 2003) * Fixed a bug with process stats on FreeBSD. * Added documentation in 'docs' directory. * Added examples in 'examples' directory. libstatgrab 0.4 (09 April 2003) * Support added for FreeBSD 4.x (not tested on 5.x). libstatgrab 0.3.4 (31 March 2003) * Fixed memory leak, and file descriptor leak on linux. libstatgrab 0.3.3 (22 March 2003) * Network statistics wraparound code was broken on interfaces that transfered no data - typically second interfaces that weren't connected. libstatgrab 0.3.2 (21 March 2003) * Network statistics wraparound fix. libstatgrab 0.3.1 (12 March 2003) * Fixed network statistics on Solaris 7 or below. * Disk IO statistics are correctly reported. libstatgrab 0.3 (10 March 2003) * Support added for Linux with a 2.4 kernel. libstatgrab 0.2 (03 March 2003) * Initial working release for Solaris (tested on 7, 8, and 9). libstatgrab-0.90/docs/saidar/000755 001750 001750 00000000000 12200045620 016076 5ustar00tdbusers000000 000000 libstatgrab-0.90/docs/libstatgrab/000755 001750 001750 00000000000 12200045620 017131 5ustar00tdbusers000000 000000 libstatgrab-0.90/docs/Makefile.am000644 001750 001750 00000000165 12200025312 016665 0ustar00tdbusers000000 000000 # Makefile for libstatgrab/docs # http://www.i-scream.org/libstatgrab/ # $Id$ SUBDIRS = libstatgrab statgrab saidar libstatgrab-0.90/docs/statgrab/000755 001750 001750 00000000000 12200045620 016442 5ustar00tdbusers000000 000000 libstatgrab-0.90/docs/Makefile.in000644 001750 001750 00000044424 12200045540 016711 0ustar00tdbusers000000 000000 # Makefile.in generated by automake 1.12.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile for libstatgrab/docs # http://www.i-scream.org/libstatgrab/ # $Id$ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = docs DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_lib.m4 \ $(top_srcdir)/m4/ax_ncurses.m4 $(top_srcdir)/m4/ax_perl5.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_shellvars.m4 $(top_srcdir)/m4/ax_types.m4 \ $(top_srcdir)/m4/ax_visibility.m4 $(top_srcdir)/m4/ax_win32.m4 \ $(top_srcdir)/m4/ax_xopen.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIN_GROUP = @BIN_GROUP@ BIN_OWNER = @BIN_OWNER@ BIN_PERM = @BIN_PERM@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CLIBFLAGS = @CLIBFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOCBOOK2MAN = @DOCBOOK2MAN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ HAVE_LIBLOG4CPLUS = @HAVE_LIBLOG4CPLUS@ INC_LOG4CPLUS = @INC_LOG4CPLUS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBS_LOG4CPLUS = @LIBS_LOG4CPLUS@ LIBTOOL = @LIBTOOL@ LINKFLAGS = @LINKFLAGS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL5 = @PERL5@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SAIDARCPPFLAGS = @SAIDARCPPFLAGS@ SAIDARLIBS = @SAIDARLIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SG_EXPORT = @SG_EXPORT@ SG_IMPORT = @SG_IMPORT@ SG_PRIVATE = @SG_PRIVATE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_LIBLOG4CPLUS = @WITH_LIBLOG4CPLUS@ WITH_THREADS_CONFIGURED = @WITH_THREADS_CONFIGURED@ WITH_VISIBILITY_SUPPORT = @WITH_VISIBILITY_SUPPORT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log4cplus_CFLAGS = @log4cplus_CFLAGS@ log4cplus_LIBS = @log4cplus_LIBS@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = libstatgrab statgrab saidar all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign docs/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign docs/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done cscopelist-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \ cscopelist-recursive ctags-recursive install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ cscopelist cscopelist-recursive ctags ctags-recursive \ distclean distclean-generic distclean-libtool distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libstatgrab-0.90/docs/statgrab/Makefile.am000644 001750 001750 00000000612 12200025312 020471 0ustar00tdbusers000000 000000 # Makefile for libstatgrab/docs/statgrab # http://www.i-scream.org/libstatgrab/ # $Id$ if STATGRAB man_MANS = statgrab.1 statgrab-make-mrtg-config.1 \ statgrab-make-mrtg-index.1 endif EXTRA_DIST = $(man_MANS) if BUILD_MANPAGES MAINTAINERCLEANFILES= $(man_MANS) .xml.1: $(DOCBOOK2MAN) -N --symlinks --string-param \ header-3="`git log -1 --format='%ad' --date=short $<`" \ $< endif libstatgrab-0.90/docs/statgrab/Makefile.in000644 001750 001750 00000037130 12200045540 020514 0ustar00tdbusers000000 000000 # Makefile.in generated by automake 1.12.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile for libstatgrab/docs/statgrab # http://www.i-scream.org/libstatgrab/ # $Id$ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = docs/statgrab DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_lib.m4 \ $(top_srcdir)/m4/ax_ncurses.m4 $(top_srcdir)/m4/ax_perl5.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_shellvars.m4 $(top_srcdir)/m4/ax_types.m4 \ $(top_srcdir)/m4/ax_visibility.m4 $(top_srcdir)/m4/ax_win32.m4 \ $(top_srcdir)/m4/ax_xopen.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(man_MANS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIN_GROUP = @BIN_GROUP@ BIN_OWNER = @BIN_OWNER@ BIN_PERM = @BIN_PERM@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CLIBFLAGS = @CLIBFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOCBOOK2MAN = @DOCBOOK2MAN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ HAVE_LIBLOG4CPLUS = @HAVE_LIBLOG4CPLUS@ INC_LOG4CPLUS = @INC_LOG4CPLUS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBS_LOG4CPLUS = @LIBS_LOG4CPLUS@ LIBTOOL = @LIBTOOL@ LINKFLAGS = @LINKFLAGS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL5 = @PERL5@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SAIDARCPPFLAGS = @SAIDARCPPFLAGS@ SAIDARLIBS = @SAIDARLIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SG_EXPORT = @SG_EXPORT@ SG_IMPORT = @SG_IMPORT@ SG_PRIVATE = @SG_PRIVATE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_LIBLOG4CPLUS = @WITH_LIBLOG4CPLUS@ WITH_THREADS_CONFIGURED = @WITH_THREADS_CONFIGURED@ WITH_VISIBILITY_SUPPORT = @WITH_VISIBILITY_SUPPORT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log4cplus_CFLAGS = @log4cplus_CFLAGS@ log4cplus_LIBS = @log4cplus_LIBS@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @STATGRAB_TRUE@man_MANS = statgrab.1 statgrab-make-mrtg-config.1 \ @STATGRAB_TRUE@ statgrab-make-mrtg-index.1 EXTRA_DIST = $(man_MANS) @BUILD_MANPAGES_TRUE@MAINTAINERCLEANFILES = $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .1 .xml $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign docs/statgrab/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign docs/statgrab/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: cscope cscopelist: distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the 'missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically 'make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ uninstall uninstall-am uninstall-man uninstall-man1 @BUILD_MANPAGES_TRUE@.xml.1: @BUILD_MANPAGES_TRUE@ $(DOCBOOK2MAN) -N --symlinks --string-param \ @BUILD_MANPAGES_TRUE@ header-3="`git log -1 --format='%ad' --date=short $<`" \ @BUILD_MANPAGES_TRUE@ $< # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libstatgrab-0.90/docs/statgrab/statgrab-make-mrtg-config.1000644 001750 001750 00000002303 12200045620 023456 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH statgrab-make-mrtg-config 1 2013-06-07 i-scream "" .SH NAME statgrab-make-mrtg-config \- generates MRTG configuration .SH SYNOPSIS 'nh .fi .ad l \fBstatgrab-make-mrtg-config\fR \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu [OPTION]\&... 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \fBstatgrab-make-mrtg-config\fR generates MRTG configuration from statgrab output and writes it to stdout. .SH OPTIONS The following options are supported. .TP \*(T<\fB\-\-no\-header\fR\*(T> Don't print MRTG global options; useful if you want to include the output of this script in another MRTG config file .TP \*(T<\fB\-\-workdir\fR\*(T> \fIPATH\fR Use PATH for MRTG's WorkDir option .TP \*(T<\fB\-\-statgrab\fR\*(T> \fIPATH\fR Specify location of statgrab binary (default "statgrab") .TP \*(T<\fB\-\-help\fR\*(T> Display help and exit .SH "SEE ALSO" \fBstatgrab\fR(1) \fBstatgrab-make-mrtg-index\fR(1) .SH AUTHORS This man page was derived from the man page written by Bartosz Fenski for the Debian GNU/Linux distribution. .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/statgrab/statgrab-make-mrtg-index.1000644 001750 001750 00000001777 12200045620 023336 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH statgrab-make-mrtg-index 1 2013-06-07 i-scream "" .SH NAME statgrab-make-mrtg-index \- generates MRTG configuration .SH SYNOPSIS 'nh .fi .ad l \fBstatgrab-make-mrtg-index\fR \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu [OPTION]\&... [CONFIGFILE]\&... 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \fBstatgrab-make-mrtg-index\fR generates an XHTML index page from MRTG configuration files specified on the command line or read from stdin. .SH OPTIONS The following options are supported. .TP \*(T<\fB\-\-title\fR\*(T> \fITITLE\fR Use TITLE as the title of the generated page .TP \*(T<\fB\-\-help\fR\*(T> Display help and exit .SH "SEE ALSO" \fBstatgrab\fR(1) \fBstatgrab-make-mrtg-config\fR(1) .SH AUTHORS This man page was derived from the man page written by Bartosz Fenski for the Debian GNU/Linux distribution. .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/statgrab/statgrab.1000644 001750 001750 00000004054 12200045620 020336 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH statgrab 1 2013-06-07 i-scream "" .SH NAME statgrab \- sysctl-style interface to system statistics .SH SYNOPSIS 'nh .fi .ad l \fBstatgrab\fR \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu [OPTION]\&... [STAT]\&... 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \fBstatgrab\fR provides a sysctl-style interface to all the system statistics available through libstatgrab. This is useful for applications that don't want to make library calls, but still want to access the statistics. .PP An example of such an application is mrtg, for which scripts are provided to generate configuration files. .SH OPTIONS The following options are supported. .TP \*(T<\fB\-l\fR\*(T> Linux sysctl-style output (default) .TP \*(T<\fB\-b\fR\*(T> BSD sysctl-style output .TP \*(T<\fB\-m\fR\*(T> MRTG-compatible output .TP \*(T<\fB\-u\fR\*(T> Plain output (only show values) .TP \*(T<\fB\-n\fR\*(T> Display cumulative stats once (default) .TP \*(T<\fB\-s\fR\*(T> Display stat differences repeatedly .TP \*(T<\fB\-o\fR\*(T> Display stat differences once .TP \*(T<\fB\-t\fR\*(T> \fIDELAY\fR When repeating, wait DELAY seconds between updates (default 1) .TP \*(T<\fB\-p\fR\*(T> Display CPU usage differences as percentages rather than absolute values .TP \*(T<\fB\-f\fR\*(T> \fIFACTOR\fR Display floating-point values as integers scaled by FACTOR .TP \*(T<\fB\-K\fR\*(T> Display byte counts in kibibytes .TP \*(T<\fB\-M\fR\*(T> Display byte counts in mebibytes .TP \*(T<\fB\-G\fR\*(T> Display byte counts in gibibytes .PP If no \*(T<\fBSTAT\fR\*(T> options are given, all will be displayed. Specify 'STAT.' to display all statistics starting with that prefix. .SH "SEE ALSO" \fBstatgrab-make-mrtg-config\fR(1) \fBstatgrab-make-mrtg-index\fR(1) \fBsaidar\fR(1) \fBstatgrab\fR(3) .SH AUTHORS This man page was derived from the man page written by Bartosz Fenski for the Debian GNU/Linux distribution. .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_free_network_iface_stats.3000644 001750 001750 00000010272 12200045617 024755 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_network_iface_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_network_iface_stats, sg_get_network_iface_stats_r, sg_free_network_iface_stats, sg_network_iface_compare_name \- get network interface statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_network_iface_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The functions \*(T<\fBsg_get_network_iface_stats\fR\*(T>() and \*(T<\fBsg_get_network_iface_stats_r\fR\*(T>() return statistics about the network interfaces in the machine. Specifically, they return the speed of the interface, the duplex state, and whether it is currently up. Both functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l l | l | l. T{ sg_get_network_iface_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_network_iface_stats_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_network_iface_stats_r\fR\*(T>() must be freed using \*(T<\fBsg_free_network_iface_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .PP Additionally a support function for \*(T<\fBqsort\fR\*(T>(3) in available: \*(T<\fBsg_network_iface_compare_name\fR\*(T>(). \fBSort Example\fR .PP .nf \*(T< size_t entries; sg_network_iface_stats *network_iface_stats = NULL; while( NULL != ( network_iface_stats = sg_get_network_iface_stats(&entries) ) ) { /* order entries alphabetically using the mountpoint */ qsort( network_iface_stats, entries, sizeof(network_iface_stats[0]), &sg_network_iface_compare_name ); show_network_iface_stats( network_iface_stats ); } \*(T> .fi .SH "RETURN VALUES" The \*(T<\fBsg_get_network_iface_stats\fR\*(T> returns a pointer to a structure of type \*(T. .PP .nf \*(T< typedef enum{ SG_IFACE_DUPLEX_FULL, SG_IFACE_DUPLEX_HALF, SG_IFACE_DUPLEX_UNKNOWN }sg_iface_duplex; \*(T> .fi .PP Note: The \*(T value could mean that duplex hasn't been negotiated yet. .PP .nf \*(T< typedef struct { char *interface_name; int speed; sg_iface_duplex duplex; int up; time_t systime; } sg_network_iface_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be eth0) .TP \*(T The speed of the interface, in megabits/sec. .TP \*(T The duplex state the interface is in. See sg_iface_duplex for permitted values. .TP \*(T Whether the interface is up. .TP \*(T The timestamp when the above stats where collected in seconds since epoch .SH BUGS Getting specific details may require elevated privileges, eg. on Linux the interface speed isn't visible to non-privileged processes. .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_free_user_stats.3000644 001750 001750 00000005607 12200045617 023121 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_user_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_user_stats, sg_get_user_stats_r, sg_free_user_stats \- get the current logged in users .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_user_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The user statistics module delivers some information about logged on users. Each logon is treated separately. Both statistic get functions, \*(T<\fBsg_get_user_stats\fR\*(T>() and \*(T<\fBsg_get_user_stats_r\fR\*(T>(), return a vector of \*(T with \*(T elements. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l l | l | l. T{ sg_get_user_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_user_stats_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T vector received from \*(T<\fBsg_get_user_stats_r\fR\*(T>() must be freed using \*(T<\fBsg_free_user_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .SH "RETURN VALUES" The structure returned is of type \*(T. .PP .nf \*(T< typedef struct { char *login_name; char *record_id; size_t record_id_size; char *device; char *hostname; pid_t pid; time_t login_time; time_t systime; } sg_user_stats; \*(T> .fi .TP \*(T The username which was used to log in .TP \*(T Record identifier of host database containing login information (not necessarily 0-terminated) .TP \*(T Size of the record identifier .TP \*(T Device name (eg. "pts/0") of the tty assigned to the login session .TP \*(T (remote) Hostname from where the user is logged on, eg. "infoterm7.some.kind.of.domain.local", "localhost", "10.42.17.4" or ":0.0" (in case it's a local logon via new xterm) .TP \*(T Process identifier of the process which made the entry to the logged on users database .TP \*(T Timestamp (time in seconds since epoch) when the user logged on .TP \*(T The timestamp when the above stats where collected in seconds since epoch .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_page_stats.3000644 001750 001750 00000006764 12200045617 022722 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_page_stats 3 2013-06-17 i-scream "" .SH NAME sg_get_page_stats, sg_get_page_stats_r, sg_get_page_stats_diff, sg_get_page_stats_diff_between, sg_free_page_stats \- get paging statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_page_stats *\fIcur\fR, const sg_page_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_page_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The page stats module deliver the number of pages swapped in and out, either since the machine has been booted (by the \*(T<\fBsg_get_page_stats\fR\*(T>() and \*(T<\fBsg_get_page_stats_r\fR\*(T>() functions) or the difference between two measured statistics (by the \*(T<\fBsg_get_page_stats_diff\fR\*(T>() and \*(T<\fBsg_get_page_stats_diff_between\fR\*(T>() functions). .PP The \*(T<\fBsg_get_page_stats_diff\fR\*(T>() function calculates the difference between the last call to the function \*(T<\fBsg_get_page_stats\fR\*(T>() in this thread (the statistics of the earlier call are saved and \*(T<\fBsg_get_page_stats\fR\*(T>() is called immediately after this). .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_page_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_page_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_page_stats_diff T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_page_stats_diff_between T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_page_stats_r\fR\*(T>() and the \*(T<\fBsg_get_page_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_page_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .SH "RETURN VALUES" .nf \*(T< typedef struct{ unsigned long long pages_pagein; unsigned long long pages_pageout; time_t systime; }sg_page_stats; \*(T> .fi .TP \*(T The number of pages swapped into memory. .TP \*(T The number of pages swapped out of memory (to swap). .TP \*(T The timestamp when the above stats where collected in seconds since epoch or the time period over which \*(T and \*(T were transferred. .SH BUGS Solaris doesn't seem to report accurately. It reports the number of pages swapped into memory, not necessarily from swap. This feature isn't deemed entirely reliable. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_error_errno.3000644 001750 001750 00000007477 12200045616 023127 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_error 3 2013-06-07 i-scream "" .SH NAME sg_get_error, sg_get_error_arg, sg_get_error_errno, sg_str_error, sg_get_error_details, sg_strperror \- get last error status .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error_details *\fIerr_details\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error \fIcode\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(char **\fIbuf\fR, const sg_error_details * const \fIerr_details\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION There are four functions to get information about the last occurred error: \*(T<\fBsg_get_error\fR\*(T>, \*(T<\fBsg_get_error_arg\fR\*(T>, \*(T<\fBsg_get_error_errno\fR\*(T> and \*(T<\fBsg_get_error_details\fR\*(T>. The remaining functions are intended to improve the machine-human-interface (e.g. the error log or a message box): \*(T<\fBsg_str_error\fR\*(T> delivers a human readable error name and \*(T<\fBsg_strperror\fR\*(T> prepares a full blown error message for printing. .PP The error argument (\*(T<\fBsg_get_error_arg\fR\*(T>) is stored thread local and is reused every time an error occures. If a later usage is intended, duplicating it is a suitable strategy. Same for the \*(T of \*(T delivered by \*(T<\fBsg_get_error_details\fR\*(T>. .PP When someone calls the function \*(T<\fBsg_get_error_details\fR\*(T> with a NULL pointer, the last error is overridden with a new one describing that \*(T<\fBsg_get_error_details\fR\*(T> is called with invalid arguments. Please be careful. .PP The function \*(T<\fBsg_strperror\fR\*(T> is allowed to be called with or without (\*(T is NULL) collected error details. In the latter case, the last occurred error of this thread is used to prepare the error message. Be aware, the the buffer pointer must be non-NULL (points to an existing \*(T lvalue), but the \*(T lvalue it points to, must be NULL. When invoked correctly, there are only two possible error conditions let \*(T<\fBsg_strperror\fR\*(T> fail: ENOMEM (out of memory) and EINVAL (invalid error code). \fBExample\fR .PP .nf \*(T< if( NULL == sg_get_cpu_stats() ) { char *buf = NULL; if( NULL != sg_strperror( &buf, NULL ) ) { fprintf( stderr, "error getting CPU stats: %s\en", buf ); free(buf); exit(255); } else { fprintf( stderr, "error getting CPU stats and error information\en" ); exit(255); } } \*(T> .fi .SH "RETURN VALUES" The error details contains following information: .PP .nf \*(T< typedef struct sg_error_details { sg_error error; int errno_value; const char *error_arg; } sg_error_details; \*(T> .fi .TP \*(T The statgrab library error code. .TP \*(T The operating system error code. .TP \*(T Additional information set when the error was reported. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_free_stats_buf.3000644 001750 001750 00000027361 12200045617 022720 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_vector_create 3 2013-06-07 i-scream "" .SH NAME sg_vector_create, sg_vector_clear, sg_vector_resize, sg_vector_free, sg_vector_clone, sg_vector_clone_into, sg_vector_compute_diff, sg_prove_vector, sg_get_nelements, sg_free_stats_buf \- statgrab vector management .SH SYNOPSIS 'nh .nf \*(T<#include "statgrab.h" #include "vector.h"\*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t \fIblock_size\fR, size_t \fIalloc_count\fR, size_t \fIinitial_used\fR, const sg_vector_init_info * const \fIinfo\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const struct sg_vector *\fIsrc\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIdest\fR, const struct sg_vector *\fIsrc\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIdest\fR, const struct sg_vector *\fIcur_vector\fR, const struct sg_vector *\fIlast_vector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const struct sg_vector *\fIvec\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_vector_create\fR\*(T>() allocates and initialises a new statgrab vector with \*(T elements ready for use. Space for \*(T elements is initially allocated (to avoid too many calls to \*(T<\fBrealloc\fR\*(T>() during later \*(T<\fBsg_vector_resize\fR\*(T>() calls). The value of \*(T must be a power of 2, it's rounded up to the next power of 2 when it's not. If \*(T is not a multiple of \*(T, it's rounded up to the next multiple of \*(T. It returns a pointer to the newly created vector. .PP \*(T<\fBsg_vector_clear\fR\*(T>() destroys all elements contained in the given vector. In opposite to \*(T<\fBsg_vector_resize\fR\*(T>( x, 0 ) the allocated size of the vector remains untouched. .PP \*(T<\fBsg_vector_resize\fR\*(T>() increases or decreases the amount of allocated elements in the specified vector. The amount of allocated elements is always a multiple of the intialisation parameter \*(T. In the special case, \*(T<\fBsg_vector_resize\fR\*(T>() is called with 0 in argument \*(T, the vector is freed after all vector elements had been destroyed. It returns the pointer to the resized vector. .PP \*(T<\fBsg_vector_free\fR\*(T>() destroys all vector elements and deallocates the storage belonging to the given vector. .PP \*(T<\fBsg_vector_clone\fR\*(T>() clones all elements of the given vector into a new vector created with the same specification as the referenced one. It returns a pointer to the cloned vector. .PP \*(T<\fBsg_vector_clone_into\fR\*(T>() clones all elements of the given source vector into the given target vector. The target vector must be created for the same element data type as the source vector. It returns an error code != to SG_ERROR_NONE if something went wrong. .PP \*(T<\fBsg_vector_compute_diff\fR\*(T>() computes a difference vector between the vector containing current statistics and another vector containing older statistics. If an element exists in the current vector but not in the opposite one, it's cloned into the result vector. If an element exists only in the opposite vector, it doesn't appear in the target vector. \*(T<\fBsg_vector_compute_diff\fR\*(T>() returns an error code != to SG_ERROR_NONE if something went wrong. .PP \*(T<\fBsg_prove_vector\fR\*(T>() proves whether a pointer to a vector really points to a vector. In case the given vector pointer points to corrupted data, the program is aborted. When \*(T<\fBsg_prove_vector\fR\*(T>() returns, it returns SG_ERROR_NONE. .PP \*(T<\fBsg_get_nelements\fR\*(T>() returns the number of elements the given data area, encompasses by a statgrab vector, contains. The vector head is internally calculated from the given pointer to the first vector element. .PP \*(T<\fBsg_free_stats_buf\fR\*(T>() frees the vector emcompassing the given data area. .SH NOTES Except \*(T<\fBsg_get_nelements\fR\*(T>() and \*(T<\fBsg_free_stats_buf\fR\*(T>() none of above functions can be called from outside of the libstatgrab sources. The documented structures and APIs may change without warning. The description of all other API is intended to be read from libstatgrab developers only. .PP Each vector is created from two elements: the vector information and the list of elements: .nf \*(T< template struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; Impl vector_implementation; T elements[alloc_count]; }; \*(T> .fi Of course, it is not valid C, so being tricky was the solution: .nf \*(T< typedef struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; struct sg_vector_init_info info; } sg_vector; struct sg_vector_size_helper { struct sg_vector v; long long ll; }; #define VECTOR_SIZE offsetof(struct sg_vector_size_helper,ll) /* Return the data ptr of a vector */ #define VECTOR_DATA(vector) \e (vector ? (void *)(((char *)vector)+VECTOR_SIZE) : NULL) #define VECTOR_ADDR_ARITH(ptr) \e (sg_vector *)(((char *)(ptr))\-VECTOR_SIZE) /* Return the vector for a data */ #define VECTOR_ADDRESS(ptr) \e ((ptr) ? (SG_ERROR_NONE == sg_prove_vector(VECTOR_ADDR_ARITH(ptr)) ? VECTOR_ADDR_ARITH(ptr) : NULL ) : NULL) \*(T> .fi .PP This also allows user functions as \*(T<\fBsg_get_nelements\fR\*(T>() and \*(T<\fBsg_free_stats_buf\fR\*(T>() to switch easily between the vector structure and the content. .SS "THE VECTOR SPECIALISATION STRUCTURE" As mentioned, the vector implementation uses strategies from the object oriented programming concept named "polymorphism". A vector is described by a small object containing inherent attributes like element size and a bunch of "virtual methods" to do element related tasks like initialising or destroying elements. .PP .nf \*(T< typedef void (*vector_init_function)(void *item); typedef sg_error (*vector_copy_function)(const void *src, void *dst); typedef sg_error (*vector_compute_diff_function)(void *dst, const void *src); typedef int (*vector_compare_function)(const void *a, const void *b); typedef void (*vector_destroy_function)(void *item); struct sg_vector_init_info { size_t item_size; vector_init_function init_fn; vector_copy_function copy_fn; vector_compute_diff_function compute_diff_fn; vector_compare_function compare_fn; vector_destroy_function destroy_fn; }; \*(T> .fi .PP The instances of struct \*(T are conceptional statically initialised by using either the preprocessor macro \*(T<\fBVECTOR_INIT_INFO_FULL_INIT\fR\*(T>(\*(T) or \*(T<\fBVECTOR_INIT_INFO_EMPTY_INIT\fR\*(T>(\*(T). Here're some examples to demonstrate how it's meant: \fBInitialising CPU statistics vector description\fR .PP .nf \*(T< VECTOR_INIT_INFO_EMPTY_INIT(sg_cpu_stats); \*(T> .fi .PP \fBInitialising Host-Info statistics vector description\fR .PP .nf \*(T< static void sg_os_stats_item_init(sg_os_stats *d); static void sg_os_stats_item_destroy(sg_os_stats *d); #define sg_os_stats_item_copy NULL #define sg_os_stats_item_compute_diff NULL #define sg_os_stats_item_compare NULL VECTOR_INIT_INFO_FULL_INIT(sg_os_stats); \*(T> .fi .PP \fBInitialising Disk-IO statistics vector description\fR .PP .nf \*(T< static void sg_disk_io_stats_item_init(sg_disk_io_stats *d); static sg_error sg_disk_io_stats_item_copy(sg_disk_io_stats *d, const sg_disk_io_stats *s); static sg_error sg_disk_io_stats_item_compute_diff(const sg_disk_io_stats *s, sg_disk_io_stats *d); static int sg_disk_io_stats_item_compare(const sg_disk_io_stats *a, const sg_disk_io_stats *b); static void sg_disk_io_stats_item_destroy(sg_disk_io_stats *d); VECTOR_INIT_INFO_FULL_INIT(sg_disk_io_stats); \*(T> .fi .SS "WORKING WITH VECTORS" To simplify the working with the vector management functions, some preprocessor macros are available. They are shown here as if they were functions to ease understanding. .PP 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fItype\fR, size_t \fIblock_size\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR, size_t \fInew_count\fR, identifier \fItype\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIvectorptr\fR, size_t \fInew_count\fR, datatype *\fIdata\fR, identifier \fIdatatype\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .PP \*(T<\fBVECTOR_CREATE\fR\*(T>() calls \*(T<\fBsg_vector_create\fR\*(T>() with \*(T and \*(T using the vector specialisation \*(T. .PP \*(T<\fBVECTOR_CLEAR\fR\*(T>() simply calls \*(T<\fBsg_vector_clear\fR\*(T>(). This macro exists only for conformity. .PP \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() calls \*(T<\fBsg_vector_create\fR\*(T>() when the given vector pointer points to \*(T or \*(T<\fBsg_vector_resize\fR\*(T>() otherwise. The result of the appropriate function is returned. .PP \*(T<\fBVECTOR_UPDATE\fR\*(T>() calls \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() and sets data to the first element of the resulting vector when a non-NULL pointer got, to NULL otherwise. When \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() returns a NULL pointer and \*(T is not equal to 0 (zero), the intructions from the macro \*(T<\fBVECTOR_UPDATE_ERROR_CLEANUP\fR\*(T> are executed to cleanup before returning from current subroutine with the error which has been occurred. .PP \*(T<\fBVECTOR_ITEM_COUNT\fR\*(T>() returns 0 for a non-existing vector (\*(T == 0) and the number of containing elements otherwise. .SH "RETURN VALUES" Beside error codes, the return values, if any, are always a pointer to vector structures (struct \*(T *). .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_network_io_stats_diff.3000644 001750 001750 00000014226 12200045617 025146 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_network_io_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_network_io_stats, sg_get_network_io_stats_r, sg_get_network_io_stats_diff, sg_get_network_io_stats_diff_between, sg_free_network_io_stats, sg_network_io_compare_name \- get network statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_network_io_stats *\fIcur\fR, const sg_network_io_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_network_iface_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_network_io_stats\fR\*(T> functions provide network interface I/O statistics on a per interface basis. All get- and diff-functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The \*(T<\fBsg_get_network_io_stats\fR\*(T>() and \*(T<\fBsg_get_network_io_stats_r\fR\*(T>() functions deliver the I/O-statistics since the interface has been attached to the system. The \*(T<\fBsg_get_network_io_stats_diff\fR\*(T>() and \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T>() deliver the difference between two calls of \*(T<\fBsg_get_network_io_stats\fR\*(T>() or \*(T<\fBsg_get_network_io_stats_r\fR\*(T>(), respectively. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_network_io_stats T} T{ sg_network_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_network_io_stats_r T} T{ sg_network_io_stats * T} T{ caller T} T{ sg_get_network_io_stats_diff T} T{ sg_network_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_network_io_stats_diff_between T} T{ sg_network_io_stats * T} T{ caller T} .TE .PP \*(T vectors received from \*(T<\fBsg_get_network_io_stats_r\fR\*(T>() or \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_network_io_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .PP Additionally a support function for \*(T<\fBqsort\fR\*(T>(3) are available: \*(T<\fBsg_network_io_compare_name\fR\*(T>(). \fBExample\fR .PP .nf \*(T< size_t entries; sg_network_io_stats *network_stats = NULL; while( NULL != ( network_stats = sg_get_network_io_stats_diff(&entries) ) ) { /* sort interface by name */ qsort( network_stats, entries, sizeof(network_stats[0]), &sg_network_io_compare_name ); show_network_io_stats( network_stats ); } \*(T> .fi .PP \*(T<\fBsg_get_network_io_stats\fR\*(T> returns the network traffic stored in the kernel which holds the amount of data transferred since device was attached. On some platforms, such as Solaris 7, this value is stored in a 32bit int, so wraps around when it reaches 4GB. Other platforms, such as Solaris 8, hold the value in a 64bit int, which wraps somewhere near 17 million terabytes. The \*(T<\fBsg_get_network_io_stats_diff\fR\*(T>() function and the \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T>() function care about these overflows and try to detect overflows when the diff is calculated. .SH "RETURN VALUES" All network statistics return a pointer to a structure of type \*(T. .PP .nf \*(T< typedef struct { char *interface_name; unsigned long long tx; unsigned long long rx; unsigned long long ipackets; unsigned long long opackets; unsigned long long ierrors; unsigned long long oerrors; unsigned long long collisions; time_t systime; } sg_network_io_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be eth0, on AIX en0 and on FreeBSD fxp0) .TP \*(T The number of bytes transmitted. .TP \*(T The number of bytes received. .TP \*(T The number of packets received. .TP \*(T The number of packets transmitted. .TP \*(T The number of receive errors. .TP \*(T The number of transmit errors. .TP \*(T The number of collisions. .TP \*(T The timestamp when the above stats where collected in seconds since epoch or the time period over which \*(T and \*(T were transferred. .SH BUGS \*(T<\fBsg_get_network_io_stats_diff\fR\*(T> and \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T> compare two lists of network interface related I/O statistics. Each entry occurring only in the second list is passed through to the resulting list as if it would have been compared to an entry with all statistic values set to 0. This implies, on the very first call \*(T<\fBsg_get_network_io_stats_diff\fR\*(T> will return the same as \*(T<\fBsg_get_network_io_stats\fR\*(T>. .PP On operating systems that hold only 32bits of data there is a problem if the values wrap twice. For example, on Solaris 7 if 9GB is transferred and the operating system wraps at 4GB, the \*(T<\fBsg_get_network_io_stats_diff\fR\*(T> function will return 5GB. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_free_network_io_stats.3000644 001750 001750 00000014226 12200045617 024320 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_network_io_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_network_io_stats, sg_get_network_io_stats_r, sg_get_network_io_stats_diff, sg_get_network_io_stats_diff_between, sg_free_network_io_stats, sg_network_io_compare_name \- get network statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_network_io_stats *\fIcur\fR, const sg_network_io_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_network_iface_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_network_io_stats\fR\*(T> functions provide network interface I/O statistics on a per interface basis. All get- and diff-functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The \*(T<\fBsg_get_network_io_stats\fR\*(T>() and \*(T<\fBsg_get_network_io_stats_r\fR\*(T>() functions deliver the I/O-statistics since the interface has been attached to the system. The \*(T<\fBsg_get_network_io_stats_diff\fR\*(T>() and \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T>() deliver the difference between two calls of \*(T<\fBsg_get_network_io_stats\fR\*(T>() or \*(T<\fBsg_get_network_io_stats_r\fR\*(T>(), respectively. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_network_io_stats T} T{ sg_network_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_network_io_stats_r T} T{ sg_network_io_stats * T} T{ caller T} T{ sg_get_network_io_stats_diff T} T{ sg_network_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_network_io_stats_diff_between T} T{ sg_network_io_stats * T} T{ caller T} .TE .PP \*(T vectors received from \*(T<\fBsg_get_network_io_stats_r\fR\*(T>() or \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_network_io_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .PP Additionally a support function for \*(T<\fBqsort\fR\*(T>(3) are available: \*(T<\fBsg_network_io_compare_name\fR\*(T>(). \fBExample\fR .PP .nf \*(T< size_t entries; sg_network_io_stats *network_stats = NULL; while( NULL != ( network_stats = sg_get_network_io_stats_diff(&entries) ) ) { /* sort interface by name */ qsort( network_stats, entries, sizeof(network_stats[0]), &sg_network_io_compare_name ); show_network_io_stats( network_stats ); } \*(T> .fi .PP \*(T<\fBsg_get_network_io_stats\fR\*(T> returns the network traffic stored in the kernel which holds the amount of data transferred since device was attached. On some platforms, such as Solaris 7, this value is stored in a 32bit int, so wraps around when it reaches 4GB. Other platforms, such as Solaris 8, hold the value in a 64bit int, which wraps somewhere near 17 million terabytes. The \*(T<\fBsg_get_network_io_stats_diff\fR\*(T>() function and the \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T>() function care about these overflows and try to detect overflows when the diff is calculated. .SH "RETURN VALUES" All network statistics return a pointer to a structure of type \*(T. .PP .nf \*(T< typedef struct { char *interface_name; unsigned long long tx; unsigned long long rx; unsigned long long ipackets; unsigned long long opackets; unsigned long long ierrors; unsigned long long oerrors; unsigned long long collisions; time_t systime; } sg_network_io_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be eth0, on AIX en0 and on FreeBSD fxp0) .TP \*(T The number of bytes transmitted. .TP \*(T The number of bytes received. .TP \*(T The number of packets received. .TP \*(T The number of packets transmitted. .TP \*(T The number of receive errors. .TP \*(T The number of transmit errors. .TP \*(T The number of collisions. .TP \*(T The timestamp when the above stats where collected in seconds since epoch or the time period over which \*(T and \*(T were transferred. .SH BUGS \*(T<\fBsg_get_network_io_stats_diff\fR\*(T> and \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T> compare two lists of network interface related I/O statistics. Each entry occurring only in the second list is passed through to the resulting list as if it would have been compared to an entry with all statistic values set to 0. This implies, on the very first call \*(T<\fBsg_get_network_io_stats_diff\fR\*(T> will return the same as \*(T<\fBsg_get_network_io_stats\fR\*(T>. .PP On operating systems that hold only 32bits of data there is a problem if the values wrap twice. For example, on Solaris 7 if 9GB is transferred and the operating system wraps at 4GB, the \*(T<\fBsg_get_network_io_stats_diff\fR\*(T> function will return 5GB. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_intro.3000644 001750 001750 00000012777 12200045620 021057 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_intro 3 2013-06-07 i-scream "" .SH NAME sg_intro \- get system statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 'hy .SH DESCRIPTION The statgrab library provides a cross-platform interface to getting system statistics. Each of the function calls to grab some statistics returns an array of structures. Functions which return always a fixed number of array entries (typical one) won't take an additional parameter to store the number of array entries, others will. Anyway, if the information isn't available anymore, you can call \*(T<\fBsg_get_nelements\fR\*(T>(). See the manual page for each individual function for more details on usage. .PP For each statistic type there are two functions available to fetch the data: \*(T<\fBsg_get_STATTYPE\fR\*(T> (e.g. \*(T<\fBsg_get_cpu_stats\fR\*(T>) and \*(T<\fBsg_get_STATTYPE_r\fR\*(T> (e.g. \*(T<\fBsg_get_cpu_stats_r\fR\*(T>). The difference between both interfaces is the ownership of the returned statistic structures: while the (well known) \*(T<\fBsg_get_cpu_stats\fR\*(T> returns a pointer to a memory area owned and controlled by the statgrab library, \*(T<\fBsg_get_cpu_stats_r\fR\*(T> will return a pointer to a memory area owned and controlled by the caller. Storage owned by the statgrab library will be reused in follow-up calls to the same statistic grabbing function within the same thread. The memory is freed when the thread ends. This could result in dangling pointers when you exchange those pointers between threads. Storage which is owned by the caller must be freed by the caller when it's not used any more. .PP \*(T<\fBsg_init\fR\*(T>() must be the first function you call before you start to use libstatgrab; it performs all the one-time initialisation operations that need setuid/setgid privileges. For instance, on *BSD it opens a descriptor to be able to read kernel structures later on, and on Solaris it reads the device mappings that in some cases are only accessible by root (machines with a /dev/osa). To handle this, each statgrab module has a private initialisation routine called by \*(T<\fBsg_init\fR\*(T>(). \*(T<\fBsg_init\fR\*(T>() takes an argument to tell whether initialisation errors of components shall abort the library initialisation process or not. Regardless of this value, the failing module initialisations will usually lead into (partially) unusable statistics. Once \*(T<\fBsg_init\fR\*(T>() has run, most of the other libstatgrab functions no longer need elevated privileges (some Unices require higher privileges to access command line argument of processes owned by other users, Linux doesn't deliver some network card information to unprivileged users, etc.). It is therefore a good idea to call \*(T<\fBsg_drop_privileges\fR\*(T>(), which discards setuid and setgid privileges, immediately after you call \*(T<\fBsg_init\fR\*(T>(), unless your application has a reason for needing setuid or setgid privileges. .PP \*(T<\fBsg_shutdown\fR\*(T>() should be the very last statgrab library function you call. You shouldn't invoke this function when any thread is still existing which had made calls to the statgrab library. If you don't invoke \*(T<\fBsg_shutdown\fR\*(T>(), it's done automatically \*(T<\fBat_exit\fR\*(T>(). .PP Both, \*(T<\fBsg_init\fR\*(T>() and \*(T<\fBsg_shutdown\fR\*(T>() use a counter to prevent to early destruction of libstatgrab in a process where more than one component uses libstatgrab. This counter is guarded by a mutual exclusion semaphore when thread capabilities are built in. .PP \*(T<\fBsg_init\fR\*(T>(), \*(T<\fBsg_shutdown\fR\*(T>() and \*(T<\fBsg_drop_privileges\fR\*(T>() return SG_ERROR_NONE on success, and any other on failure. .PP For proper thread support, \*(T<\fBsg_lock_mutex\fR\*(T>() and \*(T<\fBsg_unlock_mutex\fR\*(T>() are available to allow locking system functions which aren't thread safe. While it's generally not the wisest idea to mix calls to the statgrab library and similar calls to the system library, it is possible to protect known unsafe functions. There's currently one system API known to be not thread-safe: accessing \*(T. The other non-threadsafe functionality used by the statgrab library is the global component management during initialisation (e.g. counting the number of calls to \*(T<\fBsg_init\fR\*(T>() to prevent first call to \*(T<\fBsg_shutdown\fR\*(T>() leaves the library in an unusable status). \fBMutex name\fR: statgrab .br \fBProtects\fR: statgrab library globals .PP \fBMutex name\fR: utmp .br \fBProtects\fR: accessing login records There's currently no way to get a list of used mutex names, so beg that any author which adds more semaphores to guard implementations is fair enough to add them here. .PP It is the intended practice that whenever a libstatgrab function is called and subsequently fails that an appropriate error will be set. Please use \*(T<\fBsg_get_error\fR\*(T>() and associates to get informed about the individual circumstances of the error condition. .SH "SEE ALSO" \fBlibstatgrab\fR(3) \fBsg_get_cpu_stats\fR(3) \fBsg_get_disk_io_stats\fR(3) \fBsg_get_fs_stats\fR(3) \fBsg_get_host_info\fR(3) \fBsg_get_load_stats\fR(3) \fBsg_get_mem_stats\fR(3) \fBsg_get_network_io_stats\fR(3) \fBsg_get_network_iface_stats\fR(3) \fBsg_get_page_stats\fR(3) \fBsg_get_process_stats\fR(3) \fBsg_get_swap_stats\fR(3) \fBsg_get_user_stats\fR(3) \fBsg_get_error\fR(3) \fBsg_internal-intro\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_mem_stats_r.3000644 001750 001750 00000010454 12200045616 023073 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_mem_stats 3 2013-06-17 i-scream "" .SH NAME sg_get_mem_stats, sg_get_mem_stats_r, sg_free_mem_stats, sg_get_swap_stats, sg_get_swap_stats_r, sg_free_swap_stats \- get VM statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_mem_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_swap_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION Memory statistics are accessed through the \*(T<\fBsg_get_mem_stats\fR\*(T>() function and the \*(T<\fBsg_get_mem_stats_r\fR\*(T>() function. Both return a pointer to a \*(T buffer. Note that this statistic doesn't need to map the entire physical memory usage, it represents the real memory usable by the operating system. .PP Memory statistics are accessed through the \*(T<\fBsg_get_swap_stats\fR\*(T>() function and the \*(T<\fBsg_get_swap_stats_r\fR\*(T>() function. Both return a pointer to a \*(T buffer. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_mem_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_mem_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_swap_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_swap_stats_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_mem_stats_r\fR\*(T>() and the \*(T buffer received from \*(T<\fBsg_get_swap_stats_r\fR\*(T>() must be freed using \*(T<\fBsg_free_mem_stats\fR\*(T>() or the \*(T<\fBsg_free_swap_stats\fR\*(T>(), respectively, when not needed any more. The caller is responsible for doing it. .PP On the FreeBSD operating system elevated privileges are required to access the swap statistics. Making the program setgid kmem should be sufficient. Programs running as root will not have this problem. .SH "RETURN VALUES" The VM system calls can return a pointer to either a \*(T or a \*(T. .PP .nf \*(T< typedef struct{ unsigned long long total; unsigned long long free; unsigned long long used; unsigned long long cache; time_t systime; } sg_mem_stats; \*(T> .fi .TP \*(T The total amount of real memory in bytes. .TP \*(T The free amount of real memory in bytes. .TP \*(T The used amount of real memory in bytes. .TP \*(T The amount of real memory in bytes used for caching. .TP \*(T the timestamp when the above stats where collected in seconds since epoch .PP .nf \*(T< typedef struct { unsigned long long total; unsigned long long used; unsigned long long free; time_t systime; } sg_swap_stats; \*(T> .fi .TP \*(T The total swap space in bytes. .TP \*(T The used swap in bytes. .TP \*(T The free swap in bytes. .TP \*(T The timestamp when the above stats where collected in seconds since epoch .SH TODO Add a function to hold open the file descriptor to the kernel memory structures. Doing this would allow the elevated privileges to be dropped early on. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_process_count.3000644 001750 001750 00000026125 12200045617 023447 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_process_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_process_stats, sg_get_process_stats_r, sg_get_process_count, sg_get_process_count_of, sg_get_process_count_r, sg_free_process_count, sg_process_compare_name, sg_process_compare_pid, sg_process_compare_uid, sg_process_compare_gid, sg_process_compare_size, sg_process_compare_res, sg_process_compare_cpu, sg_process_compare_time \- get process statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count_source \fIpcs\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats const *\fIwhereof\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_process_stats\fR\*(T> functions provide statistics about the currently running processes. Both functions, \*(T<\fBsg_get_process_stats\fR\*(T>() and \*(T<\fBsg_get_process_stats_r\fR\*(T>(), take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The functions \*(T<\fBsg_get_process_count_of\fR\*(T>() and \*(T<\fBsg_get_process_count_r\fR\*(T>() provide an aggregated view of the process table - they deliver the amount of processes per process state. The \*(T<\fBsg_get_process_count\fR\*(T>() is in fact a preprocessor macro for backward compatibility and calls \*(T<\fBsg_get_process_count_of\fR\*(T>() with the parameter \*(T of sg_entire_process_count to emulate the behavior until 0.17. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_process_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_process_count_of T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_count_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_process_stats_r\fR\*(T>() or the \*(T summaries received from \*(T<\fBsg_get_process_count_r\fR\*(T> must be freed using \*(T<\fBsg_free_process_stats\fR\*(T>() or \*(T<\fBsg_free_process_count\fR\*(T>(), respectively. The caller is responsible for doing it when the data isn't needed any more. .PP \*(T<\fBsg_process_compare_name\fR\*(T> .br \*(T<\fBsg_process_compare_pid\fR\*(T> .br \*(T<\fBsg_process_compare_uid\fR\*(T> .br \*(T<\fBsg_process_compare_gid\fR\*(T> .br \*(T<\fBsg_process_compare_size\fR\*(T> .br \*(T<\fBsg_process_compare_res\fR\*(T> .br \*(T<\fBsg_process_compare_cpu\fR\*(T> .br \*(T<\fBsg_process_compare_time\fR\*(T> .PP These functions compare two sg_process_stats entries, and return an int to represent which one is greater. The main use of these functions is to be passed to qsort to sort the sg_process_stats by the given type. \fBExample\fR .PP .nf \*(T< size_t entries; sg_process_stats *proc_stats = NULL; while( NULL != ( proc_stats = sg_get_process_stats_r(&entries) ) ) { /* order entries by comparing the process identifier */ qsort( proc_stats, entries, sizeof(proc_stats[0]), &sg_process_compare_pid ); show_proc_stats( proc_stats ); sg_free_process_stats( proc_stats ); } \*(T> .fi .SH "RETURN VALUES" The structure returned by sg_get_process_stats is of type \*(T. .PP .nf \*(T< typedef struct { char *process_name; char *proctitle; pid_t pid; /* process identifier */ pid_t parent; /* Parent pid */ pid_t pgid; /* process id of process group leader */ pid_t sessid; /* session id of the session the process belongs to */ uid_t uid; uid_t euid; gid_t gid; gid_t egid; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long proc_size; /* in bytes */ unsigned long long proc_resident; /* in bytes */ time_t start_time; /* When was the process started */ time_t time_spent; /* time running in seconds */ double cpu_percent; int nice; sg_process_state state; time_t systime; } sg_process_stats; \*(T> .fi .PP .nf \*(T< typedef enum { SG_PROCESS_STATE_RUNNING, SG_PROCESS_STATE_SLEEPING, SG_PROCESS_STATE_STOPPED, SG_PROCESS_STATE_ZOMBIE, SG_PROCESS_STATE_UNKNOWN } sg_process_state; \*(T> .fi .TP \*(T The name of the command that was run. The content of this field heavily depends on the underlying operating system, some store the basename the executable passes to the \*(T<\fBexec\fR\*(T>(2) system call, some the entire path. Most OS restrict the size of this field - some like the *BSD family to a very low value of 15 bytes. This field is usually immutable for userland processes. .TP \*(T The command line (the "title") of the process. Take note - this can be modified by the process, so isn't guaranteed to be the original command line. .TP \*(T The process ID. .TP \*(T The parent process ID. .TP \*(T The process ID of the process group leader. .TP \*(T Session id of the session the process belongs to. .TP \*(T The ID of the user the process is running as. .TP \*(T The ID of the effective user the process is running as. .TP \*(T The ID of the group the process is running as. .TP \*(T The ID of the effective group the process is running as. .TP \*(T The number of context switches of this process (voluntary and involuntary). .TP \*(T The number of voluntary context switches of this process (eg. by calling \*(T<\fBsched_yield\fR\*(T>() or \*(T<\fBsleep\fR\*(T>()). .TP \*(T The number of involuntary context switches of this process (eg. time slice exhausted or signal sent). .TP \*(T The virtual memory size of the process in bytes. .TP \*(T The size of the process that's resident in memory. .TP \*(T The time when the process has been started in seconds since epoch. .TP \*(T The number of seconds the process has been running (user+system time, without time spent by child processes). .TP \*(T The current percentage of CPU the process is using. .TP \*(T The nice value of the process. .TP \*(T The current state of the process. See sg_process_state for permitted values. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. This might be (but doesn't have to be) the same moment for all returned entries, regardless whether they're fetched with one snapshot or puzzled from some kind of procfs. .PP The structure returned by sg_get_process_count_of and sg_get_process_count_r is of type \*(T. .PP .nf \*(T< typedef enum sg_process_count_source { sg_entire_process_count, sg_last_process_count } sg_process_count_source; \*(T> .fi .PP .nf \*(T< typedef struct{ unsigned long long total; unsigned long long running; unsigned long long sleeping; unsigned long long stopped; unsigned long long zombie; unsigned long long unknown; time_t systime; }sg_process_count; \*(T> .fi .TP \*(T The total number of processes. .TP \*(T The number of running processes. .TP \*(T The number of sleeping processes. .TP \*(T The number of stopped processes. .TP \*(T The number of zombie processes. .TP \*(T The number of processes not matching any of above named categories. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. .SH BUGS The very first call of \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_last_process_count) will return the same as \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_entire_process_count). .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_process_count_of.3000644 001750 001750 00000026125 12200045617 024133 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_process_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_process_stats, sg_get_process_stats_r, sg_get_process_count, sg_get_process_count_of, sg_get_process_count_r, sg_free_process_count, sg_process_compare_name, sg_process_compare_pid, sg_process_compare_uid, sg_process_compare_gid, sg_process_compare_size, sg_process_compare_res, sg_process_compare_cpu, sg_process_compare_time \- get process statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count_source \fIpcs\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats const *\fIwhereof\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_process_stats\fR\*(T> functions provide statistics about the currently running processes. Both functions, \*(T<\fBsg_get_process_stats\fR\*(T>() and \*(T<\fBsg_get_process_stats_r\fR\*(T>(), take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The functions \*(T<\fBsg_get_process_count_of\fR\*(T>() and \*(T<\fBsg_get_process_count_r\fR\*(T>() provide an aggregated view of the process table - they deliver the amount of processes per process state. The \*(T<\fBsg_get_process_count\fR\*(T>() is in fact a preprocessor macro for backward compatibility and calls \*(T<\fBsg_get_process_count_of\fR\*(T>() with the parameter \*(T of sg_entire_process_count to emulate the behavior until 0.17. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_process_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_process_count_of T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_count_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_process_stats_r\fR\*(T>() or the \*(T summaries received from \*(T<\fBsg_get_process_count_r\fR\*(T> must be freed using \*(T<\fBsg_free_process_stats\fR\*(T>() or \*(T<\fBsg_free_process_count\fR\*(T>(), respectively. The caller is responsible for doing it when the data isn't needed any more. .PP \*(T<\fBsg_process_compare_name\fR\*(T> .br \*(T<\fBsg_process_compare_pid\fR\*(T> .br \*(T<\fBsg_process_compare_uid\fR\*(T> .br \*(T<\fBsg_process_compare_gid\fR\*(T> .br \*(T<\fBsg_process_compare_size\fR\*(T> .br \*(T<\fBsg_process_compare_res\fR\*(T> .br \*(T<\fBsg_process_compare_cpu\fR\*(T> .br \*(T<\fBsg_process_compare_time\fR\*(T> .PP These functions compare two sg_process_stats entries, and return an int to represent which one is greater. The main use of these functions is to be passed to qsort to sort the sg_process_stats by the given type. \fBExample\fR .PP .nf \*(T< size_t entries; sg_process_stats *proc_stats = NULL; while( NULL != ( proc_stats = sg_get_process_stats_r(&entries) ) ) { /* order entries by comparing the process identifier */ qsort( proc_stats, entries, sizeof(proc_stats[0]), &sg_process_compare_pid ); show_proc_stats( proc_stats ); sg_free_process_stats( proc_stats ); } \*(T> .fi .SH "RETURN VALUES" The structure returned by sg_get_process_stats is of type \*(T. .PP .nf \*(T< typedef struct { char *process_name; char *proctitle; pid_t pid; /* process identifier */ pid_t parent; /* Parent pid */ pid_t pgid; /* process id of process group leader */ pid_t sessid; /* session id of the session the process belongs to */ uid_t uid; uid_t euid; gid_t gid; gid_t egid; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long proc_size; /* in bytes */ unsigned long long proc_resident; /* in bytes */ time_t start_time; /* When was the process started */ time_t time_spent; /* time running in seconds */ double cpu_percent; int nice; sg_process_state state; time_t systime; } sg_process_stats; \*(T> .fi .PP .nf \*(T< typedef enum { SG_PROCESS_STATE_RUNNING, SG_PROCESS_STATE_SLEEPING, SG_PROCESS_STATE_STOPPED, SG_PROCESS_STATE_ZOMBIE, SG_PROCESS_STATE_UNKNOWN } sg_process_state; \*(T> .fi .TP \*(T The name of the command that was run. The content of this field heavily depends on the underlying operating system, some store the basename the executable passes to the \*(T<\fBexec\fR\*(T>(2) system call, some the entire path. Most OS restrict the size of this field - some like the *BSD family to a very low value of 15 bytes. This field is usually immutable for userland processes. .TP \*(T The command line (the "title") of the process. Take note - this can be modified by the process, so isn't guaranteed to be the original command line. .TP \*(T The process ID. .TP \*(T The parent process ID. .TP \*(T The process ID of the process group leader. .TP \*(T Session id of the session the process belongs to. .TP \*(T The ID of the user the process is running as. .TP \*(T The ID of the effective user the process is running as. .TP \*(T The ID of the group the process is running as. .TP \*(T The ID of the effective group the process is running as. .TP \*(T The number of context switches of this process (voluntary and involuntary). .TP \*(T The number of voluntary context switches of this process (eg. by calling \*(T<\fBsched_yield\fR\*(T>() or \*(T<\fBsleep\fR\*(T>()). .TP \*(T The number of involuntary context switches of this process (eg. time slice exhausted or signal sent). .TP \*(T The virtual memory size of the process in bytes. .TP \*(T The size of the process that's resident in memory. .TP \*(T The time when the process has been started in seconds since epoch. .TP \*(T The number of seconds the process has been running (user+system time, without time spent by child processes). .TP \*(T The current percentage of CPU the process is using. .TP \*(T The nice value of the process. .TP \*(T The current state of the process. See sg_process_state for permitted values. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. This might be (but doesn't have to be) the same moment for all returned entries, regardless whether they're fetched with one snapshot or puzzled from some kind of procfs. .PP The structure returned by sg_get_process_count_of and sg_get_process_count_r is of type \*(T. .PP .nf \*(T< typedef enum sg_process_count_source { sg_entire_process_count, sg_last_process_count } sg_process_count_source; \*(T> .fi .PP .nf \*(T< typedef struct{ unsigned long long total; unsigned long long running; unsigned long long sleeping; unsigned long long stopped; unsigned long long zombie; unsigned long long unknown; time_t systime; }sg_process_count; \*(T> .fi .TP \*(T The total number of processes. .TP \*(T The number of running processes. .TP \*(T The number of sleeping processes. .TP \*(T The number of stopped processes. .TP \*(T The number of zombie processes. .TP \*(T The number of processes not matching any of above named categories. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. .SH BUGS The very first call of \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_last_process_count) will return the same as \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_entire_process_count). .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_free_disk_io_stats.3000644 001750 001750 00000014326 12200045616 023561 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_disk_io_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_disk_io_stats, sg_get_disk_io_stats_r, sg_get_disk_io_stats_diff, sg_get_disk_io_stats_diff_between, sg_free_disk_io_stats, sg_disk_io_compare_name, sg_disk_io_compare_traffic \- get disk io statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_disk_io_stats *\fIcur\fR, const sg_disk_io_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_disk_io_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_disk_io_stats\fR\*(T> functions provide disk I/O statistics on a per disk basis. All get- and diff-functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The \*(T<\fBsg_get_disk_io_stats\fR\*(T>() and \*(T<\fBsg_get_disk_io_stats_r\fR\*(T>() functions deliver the I/O-statistics since the disk has been attached to the system. The \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T>() and \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T>() deliver the difference between two calls of \*(T<\fBsg_get_disk_io_stats\fR\*(T>() or \*(T<\fBsg_get_disk_io_stats_r\fR\*(T>(), respectively. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_disk_io_stats T} T{ sg_disk_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_disk_io_stats_r T} T{ sg_disk_io_stats * T} T{ caller T} T{ sg_get_disk_io_stats_diff T} T{ sg_disk_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_disk_io_stats_diff_between T} T{ sg_disk_io_stats * T} T{ caller T} .TE .PP \*(T vectors got from \*(T<\fBsg_get_disk_io_stats_r\fR\*(T>() or \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_disk_io_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .PP Additionally two support functions for \*(T<\fBqsort\fR\*(T>(3) are available: \*(T<\fBsg_disk_io_compare_name\fR\*(T>() and \*(T<\fBsg_disk_io_compare_traffic\fR\*(T>(). \fBExample\fR .PP .nf \*(T< size_t entries; sg_disk_io_stats *io_stats = NULL; while( NULL != ( io_stats = sg_get_disk_io_stats_diff(&entries) ) ) { /* show disks with most traffic first */ qsort( io_stats, entries, sizeof(io_stats[0]), &sg_disk_io_compare_traffic ); show_disk_io_stats( io_stats ); } \*(T> .fi .PP On some platforms, such as Solaris 7, the kernel value is stored in a 32bit int, so wraps around when it reaches 4GB. Other platforms, such as Solaris 8 (and most other modern systems), hold the value in a 64bit int, which wraps somewhere near 17 million terabytes. The \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T>() function and the \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T>() function care about these overflows and try to detect overflows when the diff is calculated. .PP On Solaris libstatgrab will attempt to get the cXtXdXsX representation for the \*(T string. If it fails it will use a name like sd0. On some systems programs calling libstatgrab will need elevated privileges to lookup some of the names. The mappings are built up when \*(T<\fBsg_init\fR\*(T>() is called for the first time. .SH "RETURN VALUES" All diskio statistics return a pointer to a structure of type \*(T. .PP .nf \*(T< typedef struct { char *disk_name; unsigned long long read_bytes; unsigned long long write_bytes; time_t systime; } sg_disk_io_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be hda) .TP \*(T The number of bytes the disk has read. .TP \*(T The number of bytes the disk has written. .TP \*(T The time period over which \*(T and \*(T were transferred. .SH BUGS \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T> and \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T> compare two lists of disk (block device) related I/O statistics. Each entry occurring only in the second list is passed through to the resulting list as if it would have been compared to an entry with all statistic values set to 0. This implies, on the very first call \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T> will return the same as \*(T<\fBsg_get_disk_io_stats\fR\*(T>. .PP On operating systems that hold only 32bits of data there is a problem if the values wrap twice. For example, on Solaris 7 if 9GB is transferred and the operating system wraps at 4GB, the \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T>() function will return 5GB. .PP The compare functions exists rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_internal-intro.3000644 001750 001750 00000002450 12200045620 022654 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_internal-intro 3 2013-06-07 i-scream "" .SH NAME sg_internal-intro \- get system statistics .SH SYNOPSIS 'nh .nf \*(T<#include "tools.h"\*(T> .fi .sp 1 'hy .SH DESCRIPTION The statgrab library is organised into components, whereby each component contains interrelated functions. Other components are made known to the globals component by filling a \*(T structure and appending it to the list \*(T in \*(T<\fIsrc/libstatgrab/globals.c\fR\*(T>. See \fBsg_comp_init\fR(3) for details. .PP The error managing component is a mixed one, partially public (getting error status), partially private (modifying error status). The last error is held per thread once error component initialisation is run once. .PP The memory management is done by the vector and tools components. The memory management covers optimised vector management (creating, resizing, freeing, comparing, ...) and dynamic storage management (improved string management). .SH "SEE ALSO" \fBlibstatgrab\fR(3) \fBsg_intro\fR(3) \fBsg_set_error\fR(3) \fBsg_comp_init\fR(3) \fBsg_vector_create\fR(3) \fBsg_update_string\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_fs_stats.3000644 001750 001750 00000024706 12200045616 022411 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_fs_stats 3 2013-06-20 i-scream "" .SH NAME sg_get_fs_stats, sg_get_fs_stats_r, sg_get_fs_stats_diff, sg_get_fs_stats_diff_between, sg_free_fs_stats, sg_get_valid_filesystems, sg_set_valid_filesystems, sg_fs_compare_device_name, sg_fs_compare_mnt_point \- get file system statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_fs_stats *\fIcur\fR, const sg_fs_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_fs_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const char *\fIvalid_fs\fR[]);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_fs_stats\fR\*(T> functions provide statistics of mounted file systems. Both functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The \*(T<\fBsg_get_fs_stats\fR\*(T>() and \*(T<\fBsg_get_fs_stats_r\fR\*(T>() functions deliver the file system statistics of the moment the function is called. The \*(T<\fBsg_get_fs_stats_diff\fR\*(T>() and \*(T<\fBsg_get_fs_stats_diff_between\fR\*(T>() deliver the difference between two calls of \*(T<\fBsg_get_fs_stats\fR\*(T>() or \*(T<\fBsg_get_fs_stats_r\fR\*(T>(), respectively. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_fs_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_fs_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_fs_stats_diff T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_fs_stats_diff_between T} T{ \*(T * T} T{ caller T} T{ sg_get_valid_filesystems T} T{ char ** T} T{ libstatgrab (global) T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_fs_stats_r\fR\*(T>() or \*(T<\fBsg_get_fs_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_fs_stats\fR\*(T>() when not needed anymore. The caller is responsible for doing it. .PP The statgrab library comes with a built-in list of valid file system types depending on the operating system it was compiled for. Some operating systems additionally provide an API to learn the file system types known or valid to the running OS instance, which is used when detected. Nevertheless there are known problems when collecting file system statistics: network file systems are mounted from delaunched servers, file system developers run an experimental driver etc. .PP To prevent processes hang in getting file system statistics or allow developers to test their drivers, the processes may modify the list of valid file systems using the \*(T<\fBsg_get_valid_filesystems\fR\*(T>() and the \*(T<\fBsg_set_valid_filesystems\fR\*(T>(). The list of \*(T parameters both functions work with is always finished with an element pointing to NULL. .PP The returned list of \*(T<\fBsg_get_valid_filesystems\fR\*(T>() must not be modified. Always copy the list into an own structure, if you plan to extend or reduce the list: \fBRemove Network FS Example\fR .PP .nf \*(T< int compare_fs_type(const void *va, const void *vb) { const char **a = (const char **)va; const char **b = (const char **)vb; return strcmp( *a, *b ); } void filter_network_fs_types(void) { /* known network file system names on different platforms */ const char *nfs_types[] = { "nfs", "nfs3", "nfs4", "cifs", "smbfs", "samba" }; const size_t nfs_types_count = sizeof(nfs_types) / sizeof(nfs_types[0]) size_t fs_entries = 0; const char **orig_valid_fs = sg_get_valid_filesystems(&fs_entries); /* duplicate into own memory to modify list */ char **valid_fs = calloc( entries + 1, sizeof(valid_fs[0]) ); memcpy( valid_fs, orig_valid_fs, (entries + 1) * sizeof(valid_fs[0]) ); size_t i; for( i = 0; i < nfs_types_count; ++i ) { char **inv_fs = bsearch( &nfs_types[i], &valid_fs[0], fs_entries, sizeof(valid_fs[0]), compare_fs_type ); if( NULL != inv_fs ) { /* copy including trailing NULL pointer */ memmove( inv_fs, inv_fs + 1, fs_entries \- (inv_fs \- valid_fs) ); \-\-fs_entries; } } sg_set_valid_filesystems( valid_fs ); free( valid_fs ); } \*(T> .fi Note that there's no need to duplicate the strings contained in the list of valid file systems in the above example - they aren't modified. .PP The list returned by \*(T<\fBsg_get_valid_filesystems\fR\*(T>() might become invalid when used while the process makes calls to \*(T<\fBsg_set_valid_filesystems\fR\*(T>(). None of the sg_fs_stats functions protect the access to the globally used storage where the own copy of the list of the valid file systems is held. It's the responsibility of the caller not to mix configuration calls with calls to fetch statistics. .PP Additionally two support functions for \*(T<\fBqsort\fR\*(T>(3) are available: \*(T<\fBsg_fs_compare_device_name\fR\*(T>() and \*(T<\fBsg_fs_compare_mnt_point\fR\*(T>(). \fBSort Example\fR .PP .nf \*(T< size_t entries; sg_fs_stats *fs_stats = NULL; while( NULL != ( fs_stats = sg_get_fs_stats_diff(&entries) ) ) { /* order entries alphabetically using the mountpoint */ qsort( fs_stats, entries, sizeof(fs_stats[0]), &sg_fs_compare_mnt_point ); show_fs_stats( fs_stats ); } \*(T> .fi .SH "RETURN VALUES" \*(T<\fBsg_get_fs_stats\fR\*(T> returns a pointer to a structure of type \*(T. .PP .nf \*(T< typedef enum { sg_fs_unknown = 0, sg_fs_regular = 1 << 0, sg_fs_special = 1 << 1, sg_fs_loopback = 1 << 2, sg_fs_remote = 1 << 3, sg_fs_local = (sg_fs_regular | sg_fs_special), sg_fs_alltypes = (sg_fs_regular | sg_fs_special | sg_fs_loopback | sg_fs_remote) } sg_fs_device_type; \*(T> .fi .PP .nf \*(T< typedef struct { char *device_name; char *fs_type; char *mnt_point; sg_fs_device_type device_type; unsigned long long size; unsigned long long used; unsigned long long free; unsigned long long avail; unsigned long long total_inodes; unsigned long long used_inodes; unsigned long long free_inodes; unsigned long long avail_inodes; unsigned long long io_size; unsigned long long block_size; unsigned long long total_blocks; unsigned long long free_blocks; unsigned long long used_blocks; unsigned long long avail_blocks; time_t systime; } sg_fs_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be hda) .TP \*(T The file system type of the file system (eg. hpfs or ufs). .TP \*(T The mount point at which the file system is mounted. .TP \*(T The device type of the file system, currently not filled and always sg_fs_unknown. .TP \*(T The total size, in bytes, of the file system. size = used + free .TP \*(T The amount of space, in bytes, used on the file system. .TP \*(T The amount of space, in bytes, available on the file system for non-privileged users/processes (free space less reserved space). avail = free - reserved .TP \*(T The amount of space, in bytes, free on the file system. .TP \*(T The total number of inodes in the file system. .TP \*(T The number of used inodes in the file system. .TP \*(T The number of free inodes in the file system. .TP \*(T The number of free inodes available to non-privileged processes. .TP \*(T A suggested optimal block size for I/O operations -- if you're reading or writing lots of data, do it in chunks of this size. .TP \*(T The size in bytes of the minimum unit of allocation on this file system. .TP \*(T The total number of blocks in the file system. .TP \*(T The number of free blocks in the file system. .TP \*(T The number of used blocks in the file system. .TP \*(T The number of free blocks available to non-privileged processes. .TP \*(T The time in seconds since epoch when the statistic was retrieved from kernel. .SH BUGS Only mounted file systems are recognised. .PP Some file systems might be reported twice when mounted on different mount points. .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .PP Calling \*(T<\fBsg_set_valid_filesystems\fR\*(T> with an empty list with clear the internal list of valid file systems. There's currently no way to reset to the initial list. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_swap_stats.3000644 001750 001750 00000010454 12200045616 022746 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_mem_stats 3 2013-06-17 i-scream "" .SH NAME sg_get_mem_stats, sg_get_mem_stats_r, sg_free_mem_stats, sg_get_swap_stats, sg_get_swap_stats_r, sg_free_swap_stats \- get VM statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_mem_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_swap_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION Memory statistics are accessed through the \*(T<\fBsg_get_mem_stats\fR\*(T>() function and the \*(T<\fBsg_get_mem_stats_r\fR\*(T>() function. Both return a pointer to a \*(T buffer. Note that this statistic doesn't need to map the entire physical memory usage, it represents the real memory usable by the operating system. .PP Memory statistics are accessed through the \*(T<\fBsg_get_swap_stats\fR\*(T>() function and the \*(T<\fBsg_get_swap_stats_r\fR\*(T>() function. Both return a pointer to a \*(T buffer. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_mem_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_mem_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_swap_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_swap_stats_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_mem_stats_r\fR\*(T>() and the \*(T buffer received from \*(T<\fBsg_get_swap_stats_r\fR\*(T>() must be freed using \*(T<\fBsg_free_mem_stats\fR\*(T>() or the \*(T<\fBsg_free_swap_stats\fR\*(T>(), respectively, when not needed any more. The caller is responsible for doing it. .PP On the FreeBSD operating system elevated privileges are required to access the swap statistics. Making the program setgid kmem should be sufficient. Programs running as root will not have this problem. .SH "RETURN VALUES" The VM system calls can return a pointer to either a \*(T or a \*(T. .PP .nf \*(T< typedef struct{ unsigned long long total; unsigned long long free; unsigned long long used; unsigned long long cache; time_t systime; } sg_mem_stats; \*(T> .fi .TP \*(T The total amount of real memory in bytes. .TP \*(T The free amount of real memory in bytes. .TP \*(T The used amount of real memory in bytes. .TP \*(T The amount of real memory in bytes used for caching. .TP \*(T the timestamp when the above stats where collected in seconds since epoch .PP .nf \*(T< typedef struct { unsigned long long total; unsigned long long used; unsigned long long free; time_t systime; } sg_swap_stats; \*(T> .fi .TP \*(T The total swap space in bytes. .TP \*(T The used swap in bytes. .TP \*(T The free swap in bytes. .TP \*(T The timestamp when the above stats where collected in seconds since epoch .SH TODO Add a function to hold open the file descriptor to the kernel memory structures. Doing this would allow the elevated privileges to be dropped early on. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_fs_stats_diff.3000644 001750 001750 00000024706 12200045616 023401 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_fs_stats 3 2013-06-20 i-scream "" .SH NAME sg_get_fs_stats, sg_get_fs_stats_r, sg_get_fs_stats_diff, sg_get_fs_stats_diff_between, sg_free_fs_stats, sg_get_valid_filesystems, sg_set_valid_filesystems, sg_fs_compare_device_name, sg_fs_compare_mnt_point \- get file system statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_fs_stats *\fIcur\fR, const sg_fs_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_fs_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const char *\fIvalid_fs\fR[]);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_fs_stats\fR\*(T> functions provide statistics of mounted file systems. Both functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The \*(T<\fBsg_get_fs_stats\fR\*(T>() and \*(T<\fBsg_get_fs_stats_r\fR\*(T>() functions deliver the file system statistics of the moment the function is called. The \*(T<\fBsg_get_fs_stats_diff\fR\*(T>() and \*(T<\fBsg_get_fs_stats_diff_between\fR\*(T>() deliver the difference between two calls of \*(T<\fBsg_get_fs_stats\fR\*(T>() or \*(T<\fBsg_get_fs_stats_r\fR\*(T>(), respectively. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_fs_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_fs_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_fs_stats_diff T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_fs_stats_diff_between T} T{ \*(T * T} T{ caller T} T{ sg_get_valid_filesystems T} T{ char ** T} T{ libstatgrab (global) T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_fs_stats_r\fR\*(T>() or \*(T<\fBsg_get_fs_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_fs_stats\fR\*(T>() when not needed anymore. The caller is responsible for doing it. .PP The statgrab library comes with a built-in list of valid file system types depending on the operating system it was compiled for. Some operating systems additionally provide an API to learn the file system types known or valid to the running OS instance, which is used when detected. Nevertheless there are known problems when collecting file system statistics: network file systems are mounted from delaunched servers, file system developers run an experimental driver etc. .PP To prevent processes hang in getting file system statistics or allow developers to test their drivers, the processes may modify the list of valid file systems using the \*(T<\fBsg_get_valid_filesystems\fR\*(T>() and the \*(T<\fBsg_set_valid_filesystems\fR\*(T>(). The list of \*(T parameters both functions work with is always finished with an element pointing to NULL. .PP The returned list of \*(T<\fBsg_get_valid_filesystems\fR\*(T>() must not be modified. Always copy the list into an own structure, if you plan to extend or reduce the list: \fBRemove Network FS Example\fR .PP .nf \*(T< int compare_fs_type(const void *va, const void *vb) { const char **a = (const char **)va; const char **b = (const char **)vb; return strcmp( *a, *b ); } void filter_network_fs_types(void) { /* known network file system names on different platforms */ const char *nfs_types[] = { "nfs", "nfs3", "nfs4", "cifs", "smbfs", "samba" }; const size_t nfs_types_count = sizeof(nfs_types) / sizeof(nfs_types[0]) size_t fs_entries = 0; const char **orig_valid_fs = sg_get_valid_filesystems(&fs_entries); /* duplicate into own memory to modify list */ char **valid_fs = calloc( entries + 1, sizeof(valid_fs[0]) ); memcpy( valid_fs, orig_valid_fs, (entries + 1) * sizeof(valid_fs[0]) ); size_t i; for( i = 0; i < nfs_types_count; ++i ) { char **inv_fs = bsearch( &nfs_types[i], &valid_fs[0], fs_entries, sizeof(valid_fs[0]), compare_fs_type ); if( NULL != inv_fs ) { /* copy including trailing NULL pointer */ memmove( inv_fs, inv_fs + 1, fs_entries \- (inv_fs \- valid_fs) ); \-\-fs_entries; } } sg_set_valid_filesystems( valid_fs ); free( valid_fs ); } \*(T> .fi Note that there's no need to duplicate the strings contained in the list of valid file systems in the above example - they aren't modified. .PP The list returned by \*(T<\fBsg_get_valid_filesystems\fR\*(T>() might become invalid when used while the process makes calls to \*(T<\fBsg_set_valid_filesystems\fR\*(T>(). None of the sg_fs_stats functions protect the access to the globally used storage where the own copy of the list of the valid file systems is held. It's the responsibility of the caller not to mix configuration calls with calls to fetch statistics. .PP Additionally two support functions for \*(T<\fBqsort\fR\*(T>(3) are available: \*(T<\fBsg_fs_compare_device_name\fR\*(T>() and \*(T<\fBsg_fs_compare_mnt_point\fR\*(T>(). \fBSort Example\fR .PP .nf \*(T< size_t entries; sg_fs_stats *fs_stats = NULL; while( NULL != ( fs_stats = sg_get_fs_stats_diff(&entries) ) ) { /* order entries alphabetically using the mountpoint */ qsort( fs_stats, entries, sizeof(fs_stats[0]), &sg_fs_compare_mnt_point ); show_fs_stats( fs_stats ); } \*(T> .fi .SH "RETURN VALUES" \*(T<\fBsg_get_fs_stats\fR\*(T> returns a pointer to a structure of type \*(T. .PP .nf \*(T< typedef enum { sg_fs_unknown = 0, sg_fs_regular = 1 << 0, sg_fs_special = 1 << 1, sg_fs_loopback = 1 << 2, sg_fs_remote = 1 << 3, sg_fs_local = (sg_fs_regular | sg_fs_special), sg_fs_alltypes = (sg_fs_regular | sg_fs_special | sg_fs_loopback | sg_fs_remote) } sg_fs_device_type; \*(T> .fi .PP .nf \*(T< typedef struct { char *device_name; char *fs_type; char *mnt_point; sg_fs_device_type device_type; unsigned long long size; unsigned long long used; unsigned long long free; unsigned long long avail; unsigned long long total_inodes; unsigned long long used_inodes; unsigned long long free_inodes; unsigned long long avail_inodes; unsigned long long io_size; unsigned long long block_size; unsigned long long total_blocks; unsigned long long free_blocks; unsigned long long used_blocks; unsigned long long avail_blocks; time_t systime; } sg_fs_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be hda) .TP \*(T The file system type of the file system (eg. hpfs or ufs). .TP \*(T The mount point at which the file system is mounted. .TP \*(T The device type of the file system, currently not filled and always sg_fs_unknown. .TP \*(T The total size, in bytes, of the file system. size = used + free .TP \*(T The amount of space, in bytes, used on the file system. .TP \*(T The amount of space, in bytes, available on the file system for non-privileged users/processes (free space less reserved space). avail = free - reserved .TP \*(T The amount of space, in bytes, free on the file system. .TP \*(T The total number of inodes in the file system. .TP \*(T The number of used inodes in the file system. .TP \*(T The number of free inodes in the file system. .TP \*(T The number of free inodes available to non-privileged processes. .TP \*(T A suggested optimal block size for I/O operations -- if you're reading or writing lots of data, do it in chunks of this size. .TP \*(T The size in bytes of the minimum unit of allocation on this file system. .TP \*(T The total number of blocks in the file system. .TP \*(T The number of free blocks in the file system. .TP \*(T The number of used blocks in the file system. .TP \*(T The number of free blocks available to non-privileged processes. .TP \*(T The time in seconds since epoch when the statistic was retrieved from kernel. .SH BUGS Only mounted file systems are recognised. .PP Some file systems might be reported twice when mounted on different mount points. .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .PP Calling \*(T<\fBsg_set_valid_filesystems\fR\*(T> with an empty list with clear the internal list of valid file systems. There's currently no way to reset to the initial list. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_cpu_stats_diff_between.3000644 001750 001750 00000013052 12200045616 025261 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_cpu_stats 3 2013-06-17 i-scream "" .SH NAME sg_get_cpu_stats, sg_get_cpu_stats_r, sg_get_cpu_stats_diff, sg_get_cpu_stats_diff_between, sg_get_cpu_percents, sg_get_cpu_percents_of, sg_get_cpu_percents_r, sg_free_cpu_stats \- get cpu usage .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_percent_source \fIcps\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_cpu_stats *\fIwhereof\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_percents *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_cpu_stats *\fIcpu_now\fR, const sg_cpu_stats *\fIcpu_last\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION These are the categories of data delivered by the cpu stats module: \*(T<\fBsg_get_cpu_stats\fR\*(T>() and \*(T<\fBsg_get_cpu_stats_r\fR\*(T>() deliver native cpu counters since the machine has been started, \*(T<\fBsg_get_cpu_stats_diff\fR\*(T>() and \*(T<\fBsg_get_cpu_stats_diff_between\fR\*(T>() deliver native cpu counters between two \*(T<\fBsg_get_cpu_stats\fR\*(T>() calls and \*(T<\fBsg_get_cpu_percents_of\fR\*(T>() and \*(T<\fBsg_get_cpu_percents_r\fR\*(T>() deliver correlated relative cpu counters (where total is 100%). .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_cpu_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_cpu_stats_diff T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_stats_diff_between T} T{ \*(T * T} T{ caller T} T{ sg_get_cpu_percents_of T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_percents_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_cpu_stats_r\fR\*(T>() and the \*(T<\fBsg_get_cpu_stats_diff_between\fR\*(T>() as well as the \*(T buffer received from \*(T<\fBsg_get_cpu_percents_r\fR\*(T>() must be freed using \*(T<\fBsg_free_cpu_stats\fR\*(T>() or the \*(T<\fBsg_free_cpu_percents\fR\*(T>(), respectively, when not needed any more. The caller is responsible for doing it. .PP The value stored (the "ticks") will vary between operating systems. For example Solaris has a total of 100 per second, while Linux has substantially more. Also, different operating systems store different information - you won't find nice cpu on Solaris for example. .PP Modern systems shall provide information about the clock tick resolution by invoking \*(T. .SH "RETURN VALUES" There are two structures returned by the CPU statistics functions. .PP .nf \*(T< typedef struct { unsigned long long user; unsigned long long kernel; unsigned long long idle; unsigned long long iowait; unsigned long long swap; unsigned long long nice; unsigned long long total; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long syscalls; unsigned long long interrupts; unsigned long long soft_interrupts; time_t systime; } sg_cpu_stats; \*(T> .fi .PP .nf \*(T< typedef struct { double user; double kernel; double idle; double iowait; double swap; double nice; time_t time_taken; } sg_cpu_percents; \*(T> .fi .TP \*(T \*(T \*(T \*(T \*(T \*(T \*(T The different CPU states. .TP \*(T \*(T \*(T \*(T \*(T \*(T The different program actions on CPU. .TP \*(T \*(T The time taken in seconds since the last call of the function, or the system time. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_error.3000644 001750 001750 00000007477 12200045616 021722 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_error 3 2013-06-07 i-scream "" .SH NAME sg_get_error, sg_get_error_arg, sg_get_error_errno, sg_str_error, sg_get_error_details, sg_strperror \- get last error status .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error_details *\fIerr_details\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error \fIcode\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(char **\fIbuf\fR, const sg_error_details * const \fIerr_details\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION There are four functions to get information about the last occurred error: \*(T<\fBsg_get_error\fR\*(T>, \*(T<\fBsg_get_error_arg\fR\*(T>, \*(T<\fBsg_get_error_errno\fR\*(T> and \*(T<\fBsg_get_error_details\fR\*(T>. The remaining functions are intended to improve the machine-human-interface (e.g. the error log or a message box): \*(T<\fBsg_str_error\fR\*(T> delivers a human readable error name and \*(T<\fBsg_strperror\fR\*(T> prepares a full blown error message for printing. .PP The error argument (\*(T<\fBsg_get_error_arg\fR\*(T>) is stored thread local and is reused every time an error occures. If a later usage is intended, duplicating it is a suitable strategy. Same for the \*(T of \*(T delivered by \*(T<\fBsg_get_error_details\fR\*(T>. .PP When someone calls the function \*(T<\fBsg_get_error_details\fR\*(T> with a NULL pointer, the last error is overridden with a new one describing that \*(T<\fBsg_get_error_details\fR\*(T> is called with invalid arguments. Please be careful. .PP The function \*(T<\fBsg_strperror\fR\*(T> is allowed to be called with or without (\*(T is NULL) collected error details. In the latter case, the last occurred error of this thread is used to prepare the error message. Be aware, the the buffer pointer must be non-NULL (points to an existing \*(T lvalue), but the \*(T lvalue it points to, must be NULL. When invoked correctly, there are only two possible error conditions let \*(T<\fBsg_strperror\fR\*(T> fail: ENOMEM (out of memory) and EINVAL (invalid error code). \fBExample\fR .PP .nf \*(T< if( NULL == sg_get_cpu_stats() ) { char *buf = NULL; if( NULL != sg_strperror( &buf, NULL ) ) { fprintf( stderr, "error getting CPU stats: %s\en", buf ); free(buf); exit(255); } else { fprintf( stderr, "error getting CPU stats and error information\en" ); exit(255); } } \*(T> .fi .SH "RETURN VALUES" The error details contains following information: .PP .nf \*(T< typedef struct sg_error_details { sg_error error; int errno_value; const char *error_arg; } sg_error_details; \*(T> .fi .TP \*(T The statgrab library error code. .TP \*(T The operating system error code. .TP \*(T Additional information set when the error was reported. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_free_fs_stats.3000644 001750 001750 00000024706 12200045616 022553 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_fs_stats 3 2013-06-20 i-scream "" .SH NAME sg_get_fs_stats, sg_get_fs_stats_r, sg_get_fs_stats_diff, sg_get_fs_stats_diff_between, sg_free_fs_stats, sg_get_valid_filesystems, sg_set_valid_filesystems, sg_fs_compare_device_name, sg_fs_compare_mnt_point \- get file system statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_fs_stats *\fIcur\fR, const sg_fs_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_fs_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const char *\fIvalid_fs\fR[]);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_fs_stats\fR\*(T> functions provide statistics of mounted file systems. Both functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The \*(T<\fBsg_get_fs_stats\fR\*(T>() and \*(T<\fBsg_get_fs_stats_r\fR\*(T>() functions deliver the file system statistics of the moment the function is called. The \*(T<\fBsg_get_fs_stats_diff\fR\*(T>() and \*(T<\fBsg_get_fs_stats_diff_between\fR\*(T>() deliver the difference between two calls of \*(T<\fBsg_get_fs_stats\fR\*(T>() or \*(T<\fBsg_get_fs_stats_r\fR\*(T>(), respectively. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_fs_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_fs_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_fs_stats_diff T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_fs_stats_diff_between T} T{ \*(T * T} T{ caller T} T{ sg_get_valid_filesystems T} T{ char ** T} T{ libstatgrab (global) T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_fs_stats_r\fR\*(T>() or \*(T<\fBsg_get_fs_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_fs_stats\fR\*(T>() when not needed anymore. The caller is responsible for doing it. .PP The statgrab library comes with a built-in list of valid file system types depending on the operating system it was compiled for. Some operating systems additionally provide an API to learn the file system types known or valid to the running OS instance, which is used when detected. Nevertheless there are known problems when collecting file system statistics: network file systems are mounted from delaunched servers, file system developers run an experimental driver etc. .PP To prevent processes hang in getting file system statistics or allow developers to test their drivers, the processes may modify the list of valid file systems using the \*(T<\fBsg_get_valid_filesystems\fR\*(T>() and the \*(T<\fBsg_set_valid_filesystems\fR\*(T>(). The list of \*(T parameters both functions work with is always finished with an element pointing to NULL. .PP The returned list of \*(T<\fBsg_get_valid_filesystems\fR\*(T>() must not be modified. Always copy the list into an own structure, if you plan to extend or reduce the list: \fBRemove Network FS Example\fR .PP .nf \*(T< int compare_fs_type(const void *va, const void *vb) { const char **a = (const char **)va; const char **b = (const char **)vb; return strcmp( *a, *b ); } void filter_network_fs_types(void) { /* known network file system names on different platforms */ const char *nfs_types[] = { "nfs", "nfs3", "nfs4", "cifs", "smbfs", "samba" }; const size_t nfs_types_count = sizeof(nfs_types) / sizeof(nfs_types[0]) size_t fs_entries = 0; const char **orig_valid_fs = sg_get_valid_filesystems(&fs_entries); /* duplicate into own memory to modify list */ char **valid_fs = calloc( entries + 1, sizeof(valid_fs[0]) ); memcpy( valid_fs, orig_valid_fs, (entries + 1) * sizeof(valid_fs[0]) ); size_t i; for( i = 0; i < nfs_types_count; ++i ) { char **inv_fs = bsearch( &nfs_types[i], &valid_fs[0], fs_entries, sizeof(valid_fs[0]), compare_fs_type ); if( NULL != inv_fs ) { /* copy including trailing NULL pointer */ memmove( inv_fs, inv_fs + 1, fs_entries \- (inv_fs \- valid_fs) ); \-\-fs_entries; } } sg_set_valid_filesystems( valid_fs ); free( valid_fs ); } \*(T> .fi Note that there's no need to duplicate the strings contained in the list of valid file systems in the above example - they aren't modified. .PP The list returned by \*(T<\fBsg_get_valid_filesystems\fR\*(T>() might become invalid when used while the process makes calls to \*(T<\fBsg_set_valid_filesystems\fR\*(T>(). None of the sg_fs_stats functions protect the access to the globally used storage where the own copy of the list of the valid file systems is held. It's the responsibility of the caller not to mix configuration calls with calls to fetch statistics. .PP Additionally two support functions for \*(T<\fBqsort\fR\*(T>(3) are available: \*(T<\fBsg_fs_compare_device_name\fR\*(T>() and \*(T<\fBsg_fs_compare_mnt_point\fR\*(T>(). \fBSort Example\fR .PP .nf \*(T< size_t entries; sg_fs_stats *fs_stats = NULL; while( NULL != ( fs_stats = sg_get_fs_stats_diff(&entries) ) ) { /* order entries alphabetically using the mountpoint */ qsort( fs_stats, entries, sizeof(fs_stats[0]), &sg_fs_compare_mnt_point ); show_fs_stats( fs_stats ); } \*(T> .fi .SH "RETURN VALUES" \*(T<\fBsg_get_fs_stats\fR\*(T> returns a pointer to a structure of type \*(T. .PP .nf \*(T< typedef enum { sg_fs_unknown = 0, sg_fs_regular = 1 << 0, sg_fs_special = 1 << 1, sg_fs_loopback = 1 << 2, sg_fs_remote = 1 << 3, sg_fs_local = (sg_fs_regular | sg_fs_special), sg_fs_alltypes = (sg_fs_regular | sg_fs_special | sg_fs_loopback | sg_fs_remote) } sg_fs_device_type; \*(T> .fi .PP .nf \*(T< typedef struct { char *device_name; char *fs_type; char *mnt_point; sg_fs_device_type device_type; unsigned long long size; unsigned long long used; unsigned long long free; unsigned long long avail; unsigned long long total_inodes; unsigned long long used_inodes; unsigned long long free_inodes; unsigned long long avail_inodes; unsigned long long io_size; unsigned long long block_size; unsigned long long total_blocks; unsigned long long free_blocks; unsigned long long used_blocks; unsigned long long avail_blocks; time_t systime; } sg_fs_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be hda) .TP \*(T The file system type of the file system (eg. hpfs or ufs). .TP \*(T The mount point at which the file system is mounted. .TP \*(T The device type of the file system, currently not filled and always sg_fs_unknown. .TP \*(T The total size, in bytes, of the file system. size = used + free .TP \*(T The amount of space, in bytes, used on the file system. .TP \*(T The amount of space, in bytes, available on the file system for non-privileged users/processes (free space less reserved space). avail = free - reserved .TP \*(T The amount of space, in bytes, free on the file system. .TP \*(T The total number of inodes in the file system. .TP \*(T The number of used inodes in the file system. .TP \*(T The number of free inodes in the file system. .TP \*(T The number of free inodes available to non-privileged processes. .TP \*(T A suggested optimal block size for I/O operations -- if you're reading or writing lots of data, do it in chunks of this size. .TP \*(T The size in bytes of the minimum unit of allocation on this file system. .TP \*(T The total number of blocks in the file system. .TP \*(T The number of free blocks in the file system. .TP \*(T The number of used blocks in the file system. .TP \*(T The number of free blocks available to non-privileged processes. .TP \*(T The time in seconds since epoch when the statistic was retrieved from kernel. .SH BUGS Only mounted file systems are recognised. .PP Some file systems might be reported twice when mounted on different mount points. .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .PP Calling \*(T<\fBsg_set_valid_filesystems\fR\*(T> with an empty list with clear the internal list of valid file systems. There's currently no way to reset to the initial list. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_load_stats_r.3000644 001750 001750 00000004153 12200045616 023233 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_load_stats 3 2013-06-17 i-scream "" .SH NAME sg_get_load_stats, sg_get_load_stats_r, sg_free_load_stats \- get system load .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_load_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION These calls returns a pointer to a buffer containing information about cumulated machine load. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l l | l | l. T{ sg_get_load_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_load_stats_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_load_stats_r\fR\*(T>() must be freed using \*(T<\fBsg_free_load_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .PP On most systems this function is just a wrapper to the \*(T<\fBgetloadavg\fR\*(T> system call. .SH "RETURN VALUES" The structure returned is of type \*(T. .PP .nf \*(T< typedef struct{ double min1; double min5; double min15; time_t systime; }sg_load_stats; \*(T> .fi .TP \*(T The load average over 1 minute. .TP \*(T The load average over 5 minutes. .TP \*(T The load average over 15 minutes. .TP \*(T The timestamp when the above stats where collected in seconds since epoch .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_free_cpu_stats.3000644 001750 001750 00000013052 12200045616 022722 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_cpu_stats 3 2013-06-17 i-scream "" .SH NAME sg_get_cpu_stats, sg_get_cpu_stats_r, sg_get_cpu_stats_diff, sg_get_cpu_stats_diff_between, sg_get_cpu_percents, sg_get_cpu_percents_of, sg_get_cpu_percents_r, sg_free_cpu_stats \- get cpu usage .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_percent_source \fIcps\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_cpu_stats *\fIwhereof\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_percents *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_cpu_stats *\fIcpu_now\fR, const sg_cpu_stats *\fIcpu_last\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION These are the categories of data delivered by the cpu stats module: \*(T<\fBsg_get_cpu_stats\fR\*(T>() and \*(T<\fBsg_get_cpu_stats_r\fR\*(T>() deliver native cpu counters since the machine has been started, \*(T<\fBsg_get_cpu_stats_diff\fR\*(T>() and \*(T<\fBsg_get_cpu_stats_diff_between\fR\*(T>() deliver native cpu counters between two \*(T<\fBsg_get_cpu_stats\fR\*(T>() calls and \*(T<\fBsg_get_cpu_percents_of\fR\*(T>() and \*(T<\fBsg_get_cpu_percents_r\fR\*(T>() deliver correlated relative cpu counters (where total is 100%). .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_cpu_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_cpu_stats_diff T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_stats_diff_between T} T{ \*(T * T} T{ caller T} T{ sg_get_cpu_percents_of T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_percents_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_cpu_stats_r\fR\*(T>() and the \*(T<\fBsg_get_cpu_stats_diff_between\fR\*(T>() as well as the \*(T buffer received from \*(T<\fBsg_get_cpu_percents_r\fR\*(T>() must be freed using \*(T<\fBsg_free_cpu_stats\fR\*(T>() or the \*(T<\fBsg_free_cpu_percents\fR\*(T>(), respectively, when not needed any more. The caller is responsible for doing it. .PP The value stored (the "ticks") will vary between operating systems. For example Solaris has a total of 100 per second, while Linux has substantially more. Also, different operating systems store different information - you won't find nice cpu on Solaris for example. .PP Modern systems shall provide information about the clock tick resolution by invoking \*(T. .SH "RETURN VALUES" There are two structures returned by the CPU statistics functions. .PP .nf \*(T< typedef struct { unsigned long long user; unsigned long long kernel; unsigned long long idle; unsigned long long iowait; unsigned long long swap; unsigned long long nice; unsigned long long total; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long syscalls; unsigned long long interrupts; unsigned long long soft_interrupts; time_t systime; } sg_cpu_stats; \*(T> .fi .PP .nf \*(T< typedef struct { double user; double kernel; double idle; double iowait; double swap; double nice; time_t time_taken; } sg_cpu_percents; \*(T> .fi .TP \*(T \*(T \*(T \*(T \*(T \*(T \*(T The different CPU states. .TP \*(T \*(T \*(T \*(T \*(T \*(T The different program actions on CPU. .TP \*(T \*(T The time taken in seconds since the last call of the function, or the system time. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_disk_io_stats_r.3000644 001750 001750 00000014326 12200045616 023740 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_disk_io_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_disk_io_stats, sg_get_disk_io_stats_r, sg_get_disk_io_stats_diff, sg_get_disk_io_stats_diff_between, sg_free_disk_io_stats, sg_disk_io_compare_name, sg_disk_io_compare_traffic \- get disk io statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_disk_io_stats *\fIcur\fR, const sg_disk_io_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_disk_io_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_disk_io_stats\fR\*(T> functions provide disk I/O statistics on a per disk basis. All get- and diff-functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The \*(T<\fBsg_get_disk_io_stats\fR\*(T>() and \*(T<\fBsg_get_disk_io_stats_r\fR\*(T>() functions deliver the I/O-statistics since the disk has been attached to the system. The \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T>() and \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T>() deliver the difference between two calls of \*(T<\fBsg_get_disk_io_stats\fR\*(T>() or \*(T<\fBsg_get_disk_io_stats_r\fR\*(T>(), respectively. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_disk_io_stats T} T{ sg_disk_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_disk_io_stats_r T} T{ sg_disk_io_stats * T} T{ caller T} T{ sg_get_disk_io_stats_diff T} T{ sg_disk_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_disk_io_stats_diff_between T} T{ sg_disk_io_stats * T} T{ caller T} .TE .PP \*(T vectors got from \*(T<\fBsg_get_disk_io_stats_r\fR\*(T>() or \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_disk_io_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .PP Additionally two support functions for \*(T<\fBqsort\fR\*(T>(3) are available: \*(T<\fBsg_disk_io_compare_name\fR\*(T>() and \*(T<\fBsg_disk_io_compare_traffic\fR\*(T>(). \fBExample\fR .PP .nf \*(T< size_t entries; sg_disk_io_stats *io_stats = NULL; while( NULL != ( io_stats = sg_get_disk_io_stats_diff(&entries) ) ) { /* show disks with most traffic first */ qsort( io_stats, entries, sizeof(io_stats[0]), &sg_disk_io_compare_traffic ); show_disk_io_stats( io_stats ); } \*(T> .fi .PP On some platforms, such as Solaris 7, the kernel value is stored in a 32bit int, so wraps around when it reaches 4GB. Other platforms, such as Solaris 8 (and most other modern systems), hold the value in a 64bit int, which wraps somewhere near 17 million terabytes. The \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T>() function and the \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T>() function care about these overflows and try to detect overflows when the diff is calculated. .PP On Solaris libstatgrab will attempt to get the cXtXdXsX representation for the \*(T string. If it fails it will use a name like sd0. On some systems programs calling libstatgrab will need elevated privileges to lookup some of the names. The mappings are built up when \*(T<\fBsg_init\fR\*(T>() is called for the first time. .SH "RETURN VALUES" All diskio statistics return a pointer to a structure of type \*(T. .PP .nf \*(T< typedef struct { char *disk_name; unsigned long long read_bytes; unsigned long long write_bytes; time_t systime; } sg_disk_io_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be hda) .TP \*(T The number of bytes the disk has read. .TP \*(T The number of bytes the disk has written. .TP \*(T The time period over which \*(T and \*(T were transferred. .SH BUGS \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T> and \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T> compare two lists of disk (block device) related I/O statistics. Each entry occurring only in the second list is passed through to the resulting list as if it would have been compared to an entry with all statistic values set to 0. This implies, on the very first call \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T> will return the same as \*(T<\fBsg_get_disk_io_stats\fR\*(T>. .PP On operating systems that hold only 32bits of data there is a problem if the values wrap twice. For example, on Solaris 7 if 9GB is transferred and the operating system wraps at 4GB, the \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T>() function will return 5GB. .PP The compare functions exists rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_process_compare_res.3000644 001750 001750 00000026125 12200045617 023757 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_process_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_process_stats, sg_get_process_stats_r, sg_get_process_count, sg_get_process_count_of, sg_get_process_count_r, sg_free_process_count, sg_process_compare_name, sg_process_compare_pid, sg_process_compare_uid, sg_process_compare_gid, sg_process_compare_size, sg_process_compare_res, sg_process_compare_cpu, sg_process_compare_time \- get process statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count_source \fIpcs\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats const *\fIwhereof\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_process_stats\fR\*(T> functions provide statistics about the currently running processes. Both functions, \*(T<\fBsg_get_process_stats\fR\*(T>() and \*(T<\fBsg_get_process_stats_r\fR\*(T>(), take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The functions \*(T<\fBsg_get_process_count_of\fR\*(T>() and \*(T<\fBsg_get_process_count_r\fR\*(T>() provide an aggregated view of the process table - they deliver the amount of processes per process state. The \*(T<\fBsg_get_process_count\fR\*(T>() is in fact a preprocessor macro for backward compatibility and calls \*(T<\fBsg_get_process_count_of\fR\*(T>() with the parameter \*(T of sg_entire_process_count to emulate the behavior until 0.17. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_process_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_process_count_of T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_count_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_process_stats_r\fR\*(T>() or the \*(T summaries received from \*(T<\fBsg_get_process_count_r\fR\*(T> must be freed using \*(T<\fBsg_free_process_stats\fR\*(T>() or \*(T<\fBsg_free_process_count\fR\*(T>(), respectively. The caller is responsible for doing it when the data isn't needed any more. .PP \*(T<\fBsg_process_compare_name\fR\*(T> .br \*(T<\fBsg_process_compare_pid\fR\*(T> .br \*(T<\fBsg_process_compare_uid\fR\*(T> .br \*(T<\fBsg_process_compare_gid\fR\*(T> .br \*(T<\fBsg_process_compare_size\fR\*(T> .br \*(T<\fBsg_process_compare_res\fR\*(T> .br \*(T<\fBsg_process_compare_cpu\fR\*(T> .br \*(T<\fBsg_process_compare_time\fR\*(T> .PP These functions compare two sg_process_stats entries, and return an int to represent which one is greater. The main use of these functions is to be passed to qsort to sort the sg_process_stats by the given type. \fBExample\fR .PP .nf \*(T< size_t entries; sg_process_stats *proc_stats = NULL; while( NULL != ( proc_stats = sg_get_process_stats_r(&entries) ) ) { /* order entries by comparing the process identifier */ qsort( proc_stats, entries, sizeof(proc_stats[0]), &sg_process_compare_pid ); show_proc_stats( proc_stats ); sg_free_process_stats( proc_stats ); } \*(T> .fi .SH "RETURN VALUES" The structure returned by sg_get_process_stats is of type \*(T. .PP .nf \*(T< typedef struct { char *process_name; char *proctitle; pid_t pid; /* process identifier */ pid_t parent; /* Parent pid */ pid_t pgid; /* process id of process group leader */ pid_t sessid; /* session id of the session the process belongs to */ uid_t uid; uid_t euid; gid_t gid; gid_t egid; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long proc_size; /* in bytes */ unsigned long long proc_resident; /* in bytes */ time_t start_time; /* When was the process started */ time_t time_spent; /* time running in seconds */ double cpu_percent; int nice; sg_process_state state; time_t systime; } sg_process_stats; \*(T> .fi .PP .nf \*(T< typedef enum { SG_PROCESS_STATE_RUNNING, SG_PROCESS_STATE_SLEEPING, SG_PROCESS_STATE_STOPPED, SG_PROCESS_STATE_ZOMBIE, SG_PROCESS_STATE_UNKNOWN } sg_process_state; \*(T> .fi .TP \*(T The name of the command that was run. The content of this field heavily depends on the underlying operating system, some store the basename the executable passes to the \*(T<\fBexec\fR\*(T>(2) system call, some the entire path. Most OS restrict the size of this field - some like the *BSD family to a very low value of 15 bytes. This field is usually immutable for userland processes. .TP \*(T The command line (the "title") of the process. Take note - this can be modified by the process, so isn't guaranteed to be the original command line. .TP \*(T The process ID. .TP \*(T The parent process ID. .TP \*(T The process ID of the process group leader. .TP \*(T Session id of the session the process belongs to. .TP \*(T The ID of the user the process is running as. .TP \*(T The ID of the effective user the process is running as. .TP \*(T The ID of the group the process is running as. .TP \*(T The ID of the effective group the process is running as. .TP \*(T The number of context switches of this process (voluntary and involuntary). .TP \*(T The number of voluntary context switches of this process (eg. by calling \*(T<\fBsched_yield\fR\*(T>() or \*(T<\fBsleep\fR\*(T>()). .TP \*(T The number of involuntary context switches of this process (eg. time slice exhausted or signal sent). .TP \*(T The virtual memory size of the process in bytes. .TP \*(T The size of the process that's resident in memory. .TP \*(T The time when the process has been started in seconds since epoch. .TP \*(T The number of seconds the process has been running (user+system time, without time spent by child processes). .TP \*(T The current percentage of CPU the process is using. .TP \*(T The nice value of the process. .TP \*(T The current state of the process. See sg_process_state for permitted values. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. This might be (but doesn't have to be) the same moment for all returned entries, regardless whether they're fetched with one snapshot or puzzled from some kind of procfs. .PP The structure returned by sg_get_process_count_of and sg_get_process_count_r is of type \*(T. .PP .nf \*(T< typedef enum sg_process_count_source { sg_entire_process_count, sg_last_process_count } sg_process_count_source; \*(T> .fi .PP .nf \*(T< typedef struct{ unsigned long long total; unsigned long long running; unsigned long long sleeping; unsigned long long stopped; unsigned long long zombie; unsigned long long unknown; time_t systime; }sg_process_count; \*(T> .fi .TP \*(T The total number of processes. .TP \*(T The number of running processes. .TP \*(T The number of sleeping processes. .TP \*(T The number of stopped processes. .TP \*(T The number of zombie processes. .TP \*(T The number of processes not matching any of above named categories. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. .SH BUGS The very first call of \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_last_process_count) will return the same as \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_entire_process_count). .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_process_count_r.3000644 001750 001750 00000026125 12200045617 023770 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_process_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_process_stats, sg_get_process_stats_r, sg_get_process_count, sg_get_process_count_of, sg_get_process_count_r, sg_free_process_count, sg_process_compare_name, sg_process_compare_pid, sg_process_compare_uid, sg_process_compare_gid, sg_process_compare_size, sg_process_compare_res, sg_process_compare_cpu, sg_process_compare_time \- get process statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count_source \fIpcs\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats const *\fIwhereof\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_process_stats\fR\*(T> functions provide statistics about the currently running processes. Both functions, \*(T<\fBsg_get_process_stats\fR\*(T>() and \*(T<\fBsg_get_process_stats_r\fR\*(T>(), take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The functions \*(T<\fBsg_get_process_count_of\fR\*(T>() and \*(T<\fBsg_get_process_count_r\fR\*(T>() provide an aggregated view of the process table - they deliver the amount of processes per process state. The \*(T<\fBsg_get_process_count\fR\*(T>() is in fact a preprocessor macro for backward compatibility and calls \*(T<\fBsg_get_process_count_of\fR\*(T>() with the parameter \*(T of sg_entire_process_count to emulate the behavior until 0.17. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_process_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_process_count_of T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_count_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_process_stats_r\fR\*(T>() or the \*(T summaries received from \*(T<\fBsg_get_process_count_r\fR\*(T> must be freed using \*(T<\fBsg_free_process_stats\fR\*(T>() or \*(T<\fBsg_free_process_count\fR\*(T>(), respectively. The caller is responsible for doing it when the data isn't needed any more. .PP \*(T<\fBsg_process_compare_name\fR\*(T> .br \*(T<\fBsg_process_compare_pid\fR\*(T> .br \*(T<\fBsg_process_compare_uid\fR\*(T> .br \*(T<\fBsg_process_compare_gid\fR\*(T> .br \*(T<\fBsg_process_compare_size\fR\*(T> .br \*(T<\fBsg_process_compare_res\fR\*(T> .br \*(T<\fBsg_process_compare_cpu\fR\*(T> .br \*(T<\fBsg_process_compare_time\fR\*(T> .PP These functions compare two sg_process_stats entries, and return an int to represent which one is greater. The main use of these functions is to be passed to qsort to sort the sg_process_stats by the given type. \fBExample\fR .PP .nf \*(T< size_t entries; sg_process_stats *proc_stats = NULL; while( NULL != ( proc_stats = sg_get_process_stats_r(&entries) ) ) { /* order entries by comparing the process identifier */ qsort( proc_stats, entries, sizeof(proc_stats[0]), &sg_process_compare_pid ); show_proc_stats( proc_stats ); sg_free_process_stats( proc_stats ); } \*(T> .fi .SH "RETURN VALUES" The structure returned by sg_get_process_stats is of type \*(T. .PP .nf \*(T< typedef struct { char *process_name; char *proctitle; pid_t pid; /* process identifier */ pid_t parent; /* Parent pid */ pid_t pgid; /* process id of process group leader */ pid_t sessid; /* session id of the session the process belongs to */ uid_t uid; uid_t euid; gid_t gid; gid_t egid; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long proc_size; /* in bytes */ unsigned long long proc_resident; /* in bytes */ time_t start_time; /* When was the process started */ time_t time_spent; /* time running in seconds */ double cpu_percent; int nice; sg_process_state state; time_t systime; } sg_process_stats; \*(T> .fi .PP .nf \*(T< typedef enum { SG_PROCESS_STATE_RUNNING, SG_PROCESS_STATE_SLEEPING, SG_PROCESS_STATE_STOPPED, SG_PROCESS_STATE_ZOMBIE, SG_PROCESS_STATE_UNKNOWN } sg_process_state; \*(T> .fi .TP \*(T The name of the command that was run. The content of this field heavily depends on the underlying operating system, some store the basename the executable passes to the \*(T<\fBexec\fR\*(T>(2) system call, some the entire path. Most OS restrict the size of this field - some like the *BSD family to a very low value of 15 bytes. This field is usually immutable for userland processes. .TP \*(T The command line (the "title") of the process. Take note - this can be modified by the process, so isn't guaranteed to be the original command line. .TP \*(T The process ID. .TP \*(T The parent process ID. .TP \*(T The process ID of the process group leader. .TP \*(T Session id of the session the process belongs to. .TP \*(T The ID of the user the process is running as. .TP \*(T The ID of the effective user the process is running as. .TP \*(T The ID of the group the process is running as. .TP \*(T The ID of the effective group the process is running as. .TP \*(T The number of context switches of this process (voluntary and involuntary). .TP \*(T The number of voluntary context switches of this process (eg. by calling \*(T<\fBsched_yield\fR\*(T>() or \*(T<\fBsleep\fR\*(T>()). .TP \*(T The number of involuntary context switches of this process (eg. time slice exhausted or signal sent). .TP \*(T The virtual memory size of the process in bytes. .TP \*(T The size of the process that's resident in memory. .TP \*(T The time when the process has been started in seconds since epoch. .TP \*(T The number of seconds the process has been running (user+system time, without time spent by child processes). .TP \*(T The current percentage of CPU the process is using. .TP \*(T The nice value of the process. .TP \*(T The current state of the process. See sg_process_state for permitted values. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. This might be (but doesn't have to be) the same moment for all returned entries, regardless whether they're fetched with one snapshot or puzzled from some kind of procfs. .PP The structure returned by sg_get_process_count_of and sg_get_process_count_r is of type \*(T. .PP .nf \*(T< typedef enum sg_process_count_source { sg_entire_process_count, sg_last_process_count } sg_process_count_source; \*(T> .fi .PP .nf \*(T< typedef struct{ unsigned long long total; unsigned long long running; unsigned long long sleeping; unsigned long long stopped; unsigned long long zombie; unsigned long long unknown; time_t systime; }sg_process_count; \*(T> .fi .TP \*(T The total number of processes. .TP \*(T The number of running processes. .TP \*(T The number of sleeping processes. .TP \*(T The number of stopped processes. .TP \*(T The number of zombie processes. .TP \*(T The number of processes not matching any of above named categories. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. .SH BUGS The very first call of \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_last_process_count) will return the same as \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_entire_process_count). .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_page_stats_diff.3000644 001750 001750 00000006764 12200045617 023712 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_page_stats 3 2013-06-17 i-scream "" .SH NAME sg_get_page_stats, sg_get_page_stats_r, sg_get_page_stats_diff, sg_get_page_stats_diff_between, sg_free_page_stats \- get paging statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_page_stats *\fIcur\fR, const sg_page_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_page_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The page stats module deliver the number of pages swapped in and out, either since the machine has been booted (by the \*(T<\fBsg_get_page_stats\fR\*(T>() and \*(T<\fBsg_get_page_stats_r\fR\*(T>() functions) or the difference between two measured statistics (by the \*(T<\fBsg_get_page_stats_diff\fR\*(T>() and \*(T<\fBsg_get_page_stats_diff_between\fR\*(T>() functions). .PP The \*(T<\fBsg_get_page_stats_diff\fR\*(T>() function calculates the difference between the last call to the function \*(T<\fBsg_get_page_stats\fR\*(T>() in this thread (the statistics of the earlier call are saved and \*(T<\fBsg_get_page_stats\fR\*(T>() is called immediately after this). .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_page_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_page_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_page_stats_diff T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_page_stats_diff_between T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_page_stats_r\fR\*(T>() and the \*(T<\fBsg_get_page_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_page_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .SH "RETURN VALUES" .nf \*(T< typedef struct{ unsigned long long pages_pagein; unsigned long long pages_pageout; time_t systime; }sg_page_stats; \*(T> .fi .TP \*(T The number of pages swapped into memory. .TP \*(T The number of pages swapped out of memory (to swap). .TP \*(T The timestamp when the above stats where collected in seconds since epoch or the time period over which \*(T and \*(T were transferred. .SH BUGS Solaris doesn't seem to report accurately. It reports the number of pages swapped into memory, not necessarily from swap. This feature isn't deemed entirely reliable. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_vector_resize.3000644 001750 001750 00000027361 12200045617 022610 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_vector_create 3 2013-06-07 i-scream "" .SH NAME sg_vector_create, sg_vector_clear, sg_vector_resize, sg_vector_free, sg_vector_clone, sg_vector_clone_into, sg_vector_compute_diff, sg_prove_vector, sg_get_nelements, sg_free_stats_buf \- statgrab vector management .SH SYNOPSIS 'nh .nf \*(T<#include "statgrab.h" #include "vector.h"\*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t \fIblock_size\fR, size_t \fIalloc_count\fR, size_t \fIinitial_used\fR, const sg_vector_init_info * const \fIinfo\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const struct sg_vector *\fIsrc\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIdest\fR, const struct sg_vector *\fIsrc\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIdest\fR, const struct sg_vector *\fIcur_vector\fR, const struct sg_vector *\fIlast_vector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const struct sg_vector *\fIvec\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_vector_create\fR\*(T>() allocates and initialises a new statgrab vector with \*(T elements ready for use. Space for \*(T elements is initially allocated (to avoid too many calls to \*(T<\fBrealloc\fR\*(T>() during later \*(T<\fBsg_vector_resize\fR\*(T>() calls). The value of \*(T must be a power of 2, it's rounded up to the next power of 2 when it's not. If \*(T is not a multiple of \*(T, it's rounded up to the next multiple of \*(T. It returns a pointer to the newly created vector. .PP \*(T<\fBsg_vector_clear\fR\*(T>() destroys all elements contained in the given vector. In opposite to \*(T<\fBsg_vector_resize\fR\*(T>( x, 0 ) the allocated size of the vector remains untouched. .PP \*(T<\fBsg_vector_resize\fR\*(T>() increases or decreases the amount of allocated elements in the specified vector. The amount of allocated elements is always a multiple of the intialisation parameter \*(T. In the special case, \*(T<\fBsg_vector_resize\fR\*(T>() is called with 0 in argument \*(T, the vector is freed after all vector elements had been destroyed. It returns the pointer to the resized vector. .PP \*(T<\fBsg_vector_free\fR\*(T>() destroys all vector elements and deallocates the storage belonging to the given vector. .PP \*(T<\fBsg_vector_clone\fR\*(T>() clones all elements of the given vector into a new vector created with the same specification as the referenced one. It returns a pointer to the cloned vector. .PP \*(T<\fBsg_vector_clone_into\fR\*(T>() clones all elements of the given source vector into the given target vector. The target vector must be created for the same element data type as the source vector. It returns an error code != to SG_ERROR_NONE if something went wrong. .PP \*(T<\fBsg_vector_compute_diff\fR\*(T>() computes a difference vector between the vector containing current statistics and another vector containing older statistics. If an element exists in the current vector but not in the opposite one, it's cloned into the result vector. If an element exists only in the opposite vector, it doesn't appear in the target vector. \*(T<\fBsg_vector_compute_diff\fR\*(T>() returns an error code != to SG_ERROR_NONE if something went wrong. .PP \*(T<\fBsg_prove_vector\fR\*(T>() proves whether a pointer to a vector really points to a vector. In case the given vector pointer points to corrupted data, the program is aborted. When \*(T<\fBsg_prove_vector\fR\*(T>() returns, it returns SG_ERROR_NONE. .PP \*(T<\fBsg_get_nelements\fR\*(T>() returns the number of elements the given data area, encompasses by a statgrab vector, contains. The vector head is internally calculated from the given pointer to the first vector element. .PP \*(T<\fBsg_free_stats_buf\fR\*(T>() frees the vector emcompassing the given data area. .SH NOTES Except \*(T<\fBsg_get_nelements\fR\*(T>() and \*(T<\fBsg_free_stats_buf\fR\*(T>() none of above functions can be called from outside of the libstatgrab sources. The documented structures and APIs may change without warning. The description of all other API is intended to be read from libstatgrab developers only. .PP Each vector is created from two elements: the vector information and the list of elements: .nf \*(T< template struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; Impl vector_implementation; T elements[alloc_count]; }; \*(T> .fi Of course, it is not valid C, so being tricky was the solution: .nf \*(T< typedef struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; struct sg_vector_init_info info; } sg_vector; struct sg_vector_size_helper { struct sg_vector v; long long ll; }; #define VECTOR_SIZE offsetof(struct sg_vector_size_helper,ll) /* Return the data ptr of a vector */ #define VECTOR_DATA(vector) \e (vector ? (void *)(((char *)vector)+VECTOR_SIZE) : NULL) #define VECTOR_ADDR_ARITH(ptr) \e (sg_vector *)(((char *)(ptr))\-VECTOR_SIZE) /* Return the vector for a data */ #define VECTOR_ADDRESS(ptr) \e ((ptr) ? (SG_ERROR_NONE == sg_prove_vector(VECTOR_ADDR_ARITH(ptr)) ? VECTOR_ADDR_ARITH(ptr) : NULL ) : NULL) \*(T> .fi .PP This also allows user functions as \*(T<\fBsg_get_nelements\fR\*(T>() and \*(T<\fBsg_free_stats_buf\fR\*(T>() to switch easily between the vector structure and the content. .SS "THE VECTOR SPECIALISATION STRUCTURE" As mentioned, the vector implementation uses strategies from the object oriented programming concept named "polymorphism". A vector is described by a small object containing inherent attributes like element size and a bunch of "virtual methods" to do element related tasks like initialising or destroying elements. .PP .nf \*(T< typedef void (*vector_init_function)(void *item); typedef sg_error (*vector_copy_function)(const void *src, void *dst); typedef sg_error (*vector_compute_diff_function)(void *dst, const void *src); typedef int (*vector_compare_function)(const void *a, const void *b); typedef void (*vector_destroy_function)(void *item); struct sg_vector_init_info { size_t item_size; vector_init_function init_fn; vector_copy_function copy_fn; vector_compute_diff_function compute_diff_fn; vector_compare_function compare_fn; vector_destroy_function destroy_fn; }; \*(T> .fi .PP The instances of struct \*(T are conceptional statically initialised by using either the preprocessor macro \*(T<\fBVECTOR_INIT_INFO_FULL_INIT\fR\*(T>(\*(T) or \*(T<\fBVECTOR_INIT_INFO_EMPTY_INIT\fR\*(T>(\*(T). Here're some examples to demonstrate how it's meant: \fBInitialising CPU statistics vector description\fR .PP .nf \*(T< VECTOR_INIT_INFO_EMPTY_INIT(sg_cpu_stats); \*(T> .fi .PP \fBInitialising Host-Info statistics vector description\fR .PP .nf \*(T< static void sg_os_stats_item_init(sg_os_stats *d); static void sg_os_stats_item_destroy(sg_os_stats *d); #define sg_os_stats_item_copy NULL #define sg_os_stats_item_compute_diff NULL #define sg_os_stats_item_compare NULL VECTOR_INIT_INFO_FULL_INIT(sg_os_stats); \*(T> .fi .PP \fBInitialising Disk-IO statistics vector description\fR .PP .nf \*(T< static void sg_disk_io_stats_item_init(sg_disk_io_stats *d); static sg_error sg_disk_io_stats_item_copy(sg_disk_io_stats *d, const sg_disk_io_stats *s); static sg_error sg_disk_io_stats_item_compute_diff(const sg_disk_io_stats *s, sg_disk_io_stats *d); static int sg_disk_io_stats_item_compare(const sg_disk_io_stats *a, const sg_disk_io_stats *b); static void sg_disk_io_stats_item_destroy(sg_disk_io_stats *d); VECTOR_INIT_INFO_FULL_INIT(sg_disk_io_stats); \*(T> .fi .SS "WORKING WITH VECTORS" To simplify the working with the vector management functions, some preprocessor macros are available. They are shown here as if they were functions to ease understanding. .PP 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fItype\fR, size_t \fIblock_size\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR, size_t \fInew_count\fR, identifier \fItype\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIvectorptr\fR, size_t \fInew_count\fR, datatype *\fIdata\fR, identifier \fIdatatype\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .PP \*(T<\fBVECTOR_CREATE\fR\*(T>() calls \*(T<\fBsg_vector_create\fR\*(T>() with \*(T and \*(T using the vector specialisation \*(T. .PP \*(T<\fBVECTOR_CLEAR\fR\*(T>() simply calls \*(T<\fBsg_vector_clear\fR\*(T>(). This macro exists only for conformity. .PP \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() calls \*(T<\fBsg_vector_create\fR\*(T>() when the given vector pointer points to \*(T or \*(T<\fBsg_vector_resize\fR\*(T>() otherwise. The result of the appropriate function is returned. .PP \*(T<\fBVECTOR_UPDATE\fR\*(T>() calls \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() and sets data to the first element of the resulting vector when a non-NULL pointer got, to NULL otherwise. When \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() returns a NULL pointer and \*(T is not equal to 0 (zero), the intructions from the macro \*(T<\fBVECTOR_UPDATE_ERROR_CLEANUP\fR\*(T> are executed to cleanup before returning from current subroutine with the error which has been occurred. .PP \*(T<\fBVECTOR_ITEM_COUNT\fR\*(T>() returns 0 for a non-existing vector (\*(T == 0) and the number of containing elements otherwise. .SH "RETURN VALUES" Beside error codes, the return values, if any, are always a pointer to vector structures (struct \*(T *). .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_global_unlock.3000644 001750 001750 00000026613 12200045620 022531 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_comp_init 3 2013-06-07 i-scream "" .SH NAME sg_comp_init, sg_comp_destroy, sg_comp_get_tls, sg_global_lock, sg_global_unlock \- managing system statistics delivery .SH SYNOPSIS 'nh .nf \*(T<#include "tools.h"\*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(unsigned int \fIid\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_comp_init\fR\*(T>() is called by \*(T<\fBsg_init\fR\*(T>() to run the initialisation for the globals component and each registered libstatgrab component. This registration is done statically by appending a component initialisation information structure (instance-of \*(T) to the \*(T list in \*(T<\fIsrc/libstatgrab/globals.c\fR\*(T>. The instance of \*(T is usually defined by using one of \*(T<\fBEASY_COMP_SETUP\fR\*(T>() or \*(T<\fBEXTENDED_COMP_SETUP\fR\*(T>(), respectively. .PP \*(T<\fBsg_comp_destroy\fR\*(T>() is called by \*(T<\fBsg_shutdown\fR\*(T>() to destroy all global resources, eg. translation tables for device names or compiled regular expressions to match path names etc. Statistics resources are managed somewhere else and are freed (conceptually and usually) before \*(T<\fBsg_comp_destroy\fR\*(T>() is invoked. .PP \*(T<\fBsg_comp_get_tls\fR\*(T>() is the internal function to access the thread local storage (formerly static globals) of the component. Usually it's easier to rely on the encapsulating macro \*(T<\fBGLOBAL_GET_TLS\fR\*(T>(). .SH NOTES Delivering system statistics is the job of libstatgrab, managing the delivery is the job of the globals component. To fulfil this job, the components to manage must be prepared: .TP 0.4i 1. declare component's global and TLS data structure (probably only on paper, not in code) .TP 0.4i 2. define global initialisation, thread destruction and process destruction functions (if required by 1.) .TP 0.4i 3. define component information structure using \*(T<\fB*_COMP_SETUP\fR\*(T>() .TP 0.4i 4. define component accessors using one or more of \*(T<\fBEASY_COMP_ACCESS\fR\*(T>() .br \*(T<\fBEASY_COMP_DIFF\fR\*(T>() .br \*(T<\fBMULTI_COMP_ACCESS\fR\*(T>() .br \*(T<\fBMULTI_COMP_DIFF\fR\*(T>() .PP When having done these steps, a new component delivering new statistics is born and needs to be "announced". Assuming the component is named \fIcpu\fR, append the line \*(T<{ &sg_cpu_init, 0 }\*(T> to above named \*(T list. .PP Component initialisation information in detail: .nf \*(T< typedef sg_error (*comp_global_init_function)(unsigned id); typedef void (*comp_global_destroy_function)(void); typedef void (*comp_global_cleanup_function)(void *); struct sg_comp_status { sg_error init_error; }; struct sg_comp_init { comp_global_init_function init_fn; comp_global_destroy_function destroy_fn; comp_global_cleanup_function cleanup_fn; size_t static_buf_size; #if defined(ENABLE_THREADS) && defined(HAVE_PTHREAD) const char **required_locks; #endif struct sg_comp_status *status; }; \*(T> .fi Components which do not need something special can rely on \*(T<\fBEASY_COMP_SETUP\fR\*(T>(): \fBInitialising memory component\fR .PP .nf \*(T< EASY_COMP_SETUP(mem,1,NULL); \*(T> .fi When own initialisation is needed, doing it is a bit more complex: \fBInitialising network component\fR .PP .nf \*(T< #define SG_NETWORK_IO_NOW_IDX 0 #define SG_NETWORK_IO_DIFF_IDX 1 #define SG_NETWORK_IFACE_IDX 2 #define SG_NETWORK_MAX_IDX 3 EXTENDED_COMP_SETUP(network,SG_NETWORK_MAX_IDX,NULL); #ifdef LINUX static regex_t network_io_rx; #define RX_MATCH_COUNT (8+1) #endif sg_error sg_network_init_comp(unsigned id) { GLOBAL_SET_ID(network,id); #ifdef LINUX if( regcomp( &network_io_rx, ..., REG_EXTENDED)!=0) { return sg_set_error(SG_ERROR_PARSE, NULL); } #endif return SG_ERROR_NONE; } void sg_network_destroy_comp(void) { #ifdef LINUX regfree(&network_io_rx); #endif } EASY_COMP_CLEANUP_FN(network,SG_NETWORK_MAX_IDX) \*(T> .fi .SS "MACROS TO WORK WITH THE COMPONENT MANAGER" To simplify working with the component management functions, some preprocessor macros are available. They are shown here as if they were functions to ease understanding. .PP 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, \fI...\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, size_t \fInvect\fR, \fI...\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, size_t \fInvect\fR, \fI...\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, unsigned int \fIid\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, size_t \fInvect\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIfn\fR, identifier \fIcomp\fR, identifier \fIstat\fR, size_t \fIidx\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIfn\fR, identifier \fIcomp\fR, identifier \fIstat\fR, size_t \fIidx\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIfn\fR, identifier \fIgetfn\fR, identifier \fIcomp\fR, identifier \fIstat\fR, size_t \fIdiffidx\fR, size_t \fInowidx\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIfn\fR, identifier \fIgetfn\fR, identifier \fIcomp\fR, identifier \fIstat\fR, size_t \fIdiffidx\fR, size_t \fInowidx\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .PP \*(T<\fBEASY_COMP_SETUP\fR\*(T>() cares about anything to be automatically done for instantiating a component information structure for the specified component \*(T. The created TLS storage structure will hold \*(T pointer elements and that's it. All initialisation, destruction and cleanup-routines are created as needed using \*(T<\fBEASY_COMP_INIT_FN\fR\*(T>(), \*(T<\fBEASY_COMP_DESTROY_FN\fR\*(T>() and \*(T<\fBEASY_COMP_CLEANUP_FN\fR\*(T>(). After the amount of required vector pointers to be stored the list of required mutexes must be specified, finished with a NULL pointer. .PP \*(T<\fBEXTENDED_COMP_SETUP\fR\*(T>() cares about anything to be automatically done for instantiating an component information structure for the specified component \*(T but the required defintion of the initialisation, destruction and cleanup routines. The created TLS storage structure will hold \*(T pointer elements and that's it. After the amount of required vector pointers to be stored, the list of required mutexes must be specified, finished with a NULL pointer. All standard routines can be created semi-automatically using \*(T<\fBEASY_COMP_INIT_FN\fR\*(T>(), \*(T<\fBEASY_COMP_DESTROY_FN\fR\*(T>() and \*(T<\fBEASY_COMP_CLEANUP_FN\fR\*(T>(). .PP \*(T<\fBDEFAULT_INIT_COMP\fR\*(T>() just declares the prototypes for the initialisation, destruction and cleanup routines, defines the initialisation status buffer, lock-names list and finally fills the component initialisation structure. Use this when your TLS storage contains not only vector pointers. .PP \*(T<\fBGLOBAL_GET_TLS\fR\*(T>() returns the pointer to the component's \fIthread local storage\fR. .PP \*(T<\fBGLOBAL_SET_ID\fR\*(T>() stores the component identifier, required eg. to access its TLS. .PP \*(T<\fBEASY_COMP_INIT_FN\fR\*(T>() defines a default component initialisation routine. It stores the component identifier and returns with SG_ERROR_NONE. .PP \*(T<\fBEASY_COMP_DESTROY_FN\fR\*(T>() defines a default component destructor, called at the end of the entire process (or when the last \*(T<\fBsg_shutdown\fR\*(T>() is called). The default destructor does nothing and usually an individual initialisation routine requires an individual destructor, too. .PP \*(T<\fBEASY_COMP_CLEANUP_FN\fR\*(T>() defines a default TLS cleanup routine, always called when a thread ends to free vectors held in \fIthread local storage\fR. .PP \*(T<\fBEASY_COMP_ACCESS\fR\*(T>() defines accessors to a specific statistic containing one element provided by the component: the functions \*(T<\fBfn\fR\*(T>() and the \*(T<\fBfn##_r\fR\*(T>(). The following function must exists: 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_vector *\fIname##_vect\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy It accesses the vector idx from TLS of component \*(T and returns sg_##name##_stats. It manages all standard things like memory and error management, return value etc. .PP \*(T<\fBEASY_COMP_DIFF\fR\*(T>() returns the difference between the two statistic collection runs. The variant dealing with statgrab owned statistics return the difference between the content currently in the vector specified by \*(T and the resulting vector of \*(T<\fBgetfn\fR\*(T>(). The result is stored in the vector \*(T. If there is no current result, simply the result of \*(T<\fBgetfn\fR\*(T>() is returned. .PP \*(T<\fBMULTI_COMP_ACCESS\fR\*(T>() defines accessors to a specific statistic containing 0..n elements provided by the component: the functions \*(T<\fBfn\fR\*(T>() and the \*(T<\fBfn##_r\fR\*(T>(). The following function must exists: 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_vector **\fIname##_vect\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy It accesses the vector idx from TLS of component \*(T and returns sg_##name##_stats. It manages all standard things like memory and error anagement, return values, \*(T update, etc. .PP \*(T<\fBMULTI_COMP_DIFF\fR\*(T>() does the same as \*(T<\fBEASY_COMP_DIFF\fR\*(T>() but for vectors with more than one element. .SH "SEE ALSO" \fBlibstatgrab\fR(3) \fBsg_intro\fR(3) \fBsg_set_error\fR(3) \fBsg_comp_init\fR(3) \fBsg_vector_create\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_process_stats.3000644 001750 001750 00000026125 12200045617 023455 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_process_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_process_stats, sg_get_process_stats_r, sg_get_process_count, sg_get_process_count_of, sg_get_process_count_r, sg_free_process_count, sg_process_compare_name, sg_process_compare_pid, sg_process_compare_uid, sg_process_compare_gid, sg_process_compare_size, sg_process_compare_res, sg_process_compare_cpu, sg_process_compare_time \- get process statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count_source \fIpcs\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats const *\fIwhereof\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_process_stats\fR\*(T> functions provide statistics about the currently running processes. Both functions, \*(T<\fBsg_get_process_stats\fR\*(T>() and \*(T<\fBsg_get_process_stats_r\fR\*(T>(), take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The functions \*(T<\fBsg_get_process_count_of\fR\*(T>() and \*(T<\fBsg_get_process_count_r\fR\*(T>() provide an aggregated view of the process table - they deliver the amount of processes per process state. The \*(T<\fBsg_get_process_count\fR\*(T>() is in fact a preprocessor macro for backward compatibility and calls \*(T<\fBsg_get_process_count_of\fR\*(T>() with the parameter \*(T of sg_entire_process_count to emulate the behavior until 0.17. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_process_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_process_count_of T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_count_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_process_stats_r\fR\*(T>() or the \*(T summaries received from \*(T<\fBsg_get_process_count_r\fR\*(T> must be freed using \*(T<\fBsg_free_process_stats\fR\*(T>() or \*(T<\fBsg_free_process_count\fR\*(T>(), respectively. The caller is responsible for doing it when the data isn't needed any more. .PP \*(T<\fBsg_process_compare_name\fR\*(T> .br \*(T<\fBsg_process_compare_pid\fR\*(T> .br \*(T<\fBsg_process_compare_uid\fR\*(T> .br \*(T<\fBsg_process_compare_gid\fR\*(T> .br \*(T<\fBsg_process_compare_size\fR\*(T> .br \*(T<\fBsg_process_compare_res\fR\*(T> .br \*(T<\fBsg_process_compare_cpu\fR\*(T> .br \*(T<\fBsg_process_compare_time\fR\*(T> .PP These functions compare two sg_process_stats entries, and return an int to represent which one is greater. The main use of these functions is to be passed to qsort to sort the sg_process_stats by the given type. \fBExample\fR .PP .nf \*(T< size_t entries; sg_process_stats *proc_stats = NULL; while( NULL != ( proc_stats = sg_get_process_stats_r(&entries) ) ) { /* order entries by comparing the process identifier */ qsort( proc_stats, entries, sizeof(proc_stats[0]), &sg_process_compare_pid ); show_proc_stats( proc_stats ); sg_free_process_stats( proc_stats ); } \*(T> .fi .SH "RETURN VALUES" The structure returned by sg_get_process_stats is of type \*(T. .PP .nf \*(T< typedef struct { char *process_name; char *proctitle; pid_t pid; /* process identifier */ pid_t parent; /* Parent pid */ pid_t pgid; /* process id of process group leader */ pid_t sessid; /* session id of the session the process belongs to */ uid_t uid; uid_t euid; gid_t gid; gid_t egid; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long proc_size; /* in bytes */ unsigned long long proc_resident; /* in bytes */ time_t start_time; /* When was the process started */ time_t time_spent; /* time running in seconds */ double cpu_percent; int nice; sg_process_state state; time_t systime; } sg_process_stats; \*(T> .fi .PP .nf \*(T< typedef enum { SG_PROCESS_STATE_RUNNING, SG_PROCESS_STATE_SLEEPING, SG_PROCESS_STATE_STOPPED, SG_PROCESS_STATE_ZOMBIE, SG_PROCESS_STATE_UNKNOWN } sg_process_state; \*(T> .fi .TP \*(T The name of the command that was run. The content of this field heavily depends on the underlying operating system, some store the basename the executable passes to the \*(T<\fBexec\fR\*(T>(2) system call, some the entire path. Most OS restrict the size of this field - some like the *BSD family to a very low value of 15 bytes. This field is usually immutable for userland processes. .TP \*(T The command line (the "title") of the process. Take note - this can be modified by the process, so isn't guaranteed to be the original command line. .TP \*(T The process ID. .TP \*(T The parent process ID. .TP \*(T The process ID of the process group leader. .TP \*(T Session id of the session the process belongs to. .TP \*(T The ID of the user the process is running as. .TP \*(T The ID of the effective user the process is running as. .TP \*(T The ID of the group the process is running as. .TP \*(T The ID of the effective group the process is running as. .TP \*(T The number of context switches of this process (voluntary and involuntary). .TP \*(T The number of voluntary context switches of this process (eg. by calling \*(T<\fBsched_yield\fR\*(T>() or \*(T<\fBsleep\fR\*(T>()). .TP \*(T The number of involuntary context switches of this process (eg. time slice exhausted or signal sent). .TP \*(T The virtual memory size of the process in bytes. .TP \*(T The size of the process that's resident in memory. .TP \*(T The time when the process has been started in seconds since epoch. .TP \*(T The number of seconds the process has been running (user+system time, without time spent by child processes). .TP \*(T The current percentage of CPU the process is using. .TP \*(T The nice value of the process. .TP \*(T The current state of the process. See sg_process_state for permitted values. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. This might be (but doesn't have to be) the same moment for all returned entries, regardless whether they're fetched with one snapshot or puzzled from some kind of procfs. .PP The structure returned by sg_get_process_count_of and sg_get_process_count_r is of type \*(T. .PP .nf \*(T< typedef enum sg_process_count_source { sg_entire_process_count, sg_last_process_count } sg_process_count_source; \*(T> .fi .PP .nf \*(T< typedef struct{ unsigned long long total; unsigned long long running; unsigned long long sleeping; unsigned long long stopped; unsigned long long zombie; unsigned long long unknown; time_t systime; }sg_process_count; \*(T> .fi .TP \*(T The total number of processes. .TP \*(T The number of running processes. .TP \*(T The number of sleeping processes. .TP \*(T The number of stopped processes. .TP \*(T The number of zombie processes. .TP \*(T The number of processes not matching any of above named categories. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. .SH BUGS The very first call of \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_last_process_count) will return the same as \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_entire_process_count). .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_vector_create.3000644 001750 001750 00000027361 12200045617 022552 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_vector_create 3 2013-06-07 i-scream "" .SH NAME sg_vector_create, sg_vector_clear, sg_vector_resize, sg_vector_free, sg_vector_clone, sg_vector_clone_into, sg_vector_compute_diff, sg_prove_vector, sg_get_nelements, sg_free_stats_buf \- statgrab vector management .SH SYNOPSIS 'nh .nf \*(T<#include "statgrab.h" #include "vector.h"\*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t \fIblock_size\fR, size_t \fIalloc_count\fR, size_t \fIinitial_used\fR, const sg_vector_init_info * const \fIinfo\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const struct sg_vector *\fIsrc\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIdest\fR, const struct sg_vector *\fIsrc\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIdest\fR, const struct sg_vector *\fIcur_vector\fR, const struct sg_vector *\fIlast_vector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const struct sg_vector *\fIvec\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_vector_create\fR\*(T>() allocates and initialises a new statgrab vector with \*(T elements ready for use. Space for \*(T elements is initially allocated (to avoid too many calls to \*(T<\fBrealloc\fR\*(T>() during later \*(T<\fBsg_vector_resize\fR\*(T>() calls). The value of \*(T must be a power of 2, it's rounded up to the next power of 2 when it's not. If \*(T is not a multiple of \*(T, it's rounded up to the next multiple of \*(T. It returns a pointer to the newly created vector. .PP \*(T<\fBsg_vector_clear\fR\*(T>() destroys all elements contained in the given vector. In opposite to \*(T<\fBsg_vector_resize\fR\*(T>( x, 0 ) the allocated size of the vector remains untouched. .PP \*(T<\fBsg_vector_resize\fR\*(T>() increases or decreases the amount of allocated elements in the specified vector. The amount of allocated elements is always a multiple of the intialisation parameter \*(T. In the special case, \*(T<\fBsg_vector_resize\fR\*(T>() is called with 0 in argument \*(T, the vector is freed after all vector elements had been destroyed. It returns the pointer to the resized vector. .PP \*(T<\fBsg_vector_free\fR\*(T>() destroys all vector elements and deallocates the storage belonging to the given vector. .PP \*(T<\fBsg_vector_clone\fR\*(T>() clones all elements of the given vector into a new vector created with the same specification as the referenced one. It returns a pointer to the cloned vector. .PP \*(T<\fBsg_vector_clone_into\fR\*(T>() clones all elements of the given source vector into the given target vector. The target vector must be created for the same element data type as the source vector. It returns an error code != to SG_ERROR_NONE if something went wrong. .PP \*(T<\fBsg_vector_compute_diff\fR\*(T>() computes a difference vector between the vector containing current statistics and another vector containing older statistics. If an element exists in the current vector but not in the opposite one, it's cloned into the result vector. If an element exists only in the opposite vector, it doesn't appear in the target vector. \*(T<\fBsg_vector_compute_diff\fR\*(T>() returns an error code != to SG_ERROR_NONE if something went wrong. .PP \*(T<\fBsg_prove_vector\fR\*(T>() proves whether a pointer to a vector really points to a vector. In case the given vector pointer points to corrupted data, the program is aborted. When \*(T<\fBsg_prove_vector\fR\*(T>() returns, it returns SG_ERROR_NONE. .PP \*(T<\fBsg_get_nelements\fR\*(T>() returns the number of elements the given data area, encompasses by a statgrab vector, contains. The vector head is internally calculated from the given pointer to the first vector element. .PP \*(T<\fBsg_free_stats_buf\fR\*(T>() frees the vector emcompassing the given data area. .SH NOTES Except \*(T<\fBsg_get_nelements\fR\*(T>() and \*(T<\fBsg_free_stats_buf\fR\*(T>() none of above functions can be called from outside of the libstatgrab sources. The documented structures and APIs may change without warning. The description of all other API is intended to be read from libstatgrab developers only. .PP Each vector is created from two elements: the vector information and the list of elements: .nf \*(T< template struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; Impl vector_implementation; T elements[alloc_count]; }; \*(T> .fi Of course, it is not valid C, so being tricky was the solution: .nf \*(T< typedef struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; struct sg_vector_init_info info; } sg_vector; struct sg_vector_size_helper { struct sg_vector v; long long ll; }; #define VECTOR_SIZE offsetof(struct sg_vector_size_helper,ll) /* Return the data ptr of a vector */ #define VECTOR_DATA(vector) \e (vector ? (void *)(((char *)vector)+VECTOR_SIZE) : NULL) #define VECTOR_ADDR_ARITH(ptr) \e (sg_vector *)(((char *)(ptr))\-VECTOR_SIZE) /* Return the vector for a data */ #define VECTOR_ADDRESS(ptr) \e ((ptr) ? (SG_ERROR_NONE == sg_prove_vector(VECTOR_ADDR_ARITH(ptr)) ? VECTOR_ADDR_ARITH(ptr) : NULL ) : NULL) \*(T> .fi .PP This also allows user functions as \*(T<\fBsg_get_nelements\fR\*(T>() and \*(T<\fBsg_free_stats_buf\fR\*(T>() to switch easily between the vector structure and the content. .SS "THE VECTOR SPECIALISATION STRUCTURE" As mentioned, the vector implementation uses strategies from the object oriented programming concept named "polymorphism". A vector is described by a small object containing inherent attributes like element size and a bunch of "virtual methods" to do element related tasks like initialising or destroying elements. .PP .nf \*(T< typedef void (*vector_init_function)(void *item); typedef sg_error (*vector_copy_function)(const void *src, void *dst); typedef sg_error (*vector_compute_diff_function)(void *dst, const void *src); typedef int (*vector_compare_function)(const void *a, const void *b); typedef void (*vector_destroy_function)(void *item); struct sg_vector_init_info { size_t item_size; vector_init_function init_fn; vector_copy_function copy_fn; vector_compute_diff_function compute_diff_fn; vector_compare_function compare_fn; vector_destroy_function destroy_fn; }; \*(T> .fi .PP The instances of struct \*(T are conceptional statically initialised by using either the preprocessor macro \*(T<\fBVECTOR_INIT_INFO_FULL_INIT\fR\*(T>(\*(T) or \*(T<\fBVECTOR_INIT_INFO_EMPTY_INIT\fR\*(T>(\*(T). Here're some examples to demonstrate how it's meant: \fBInitialising CPU statistics vector description\fR .PP .nf \*(T< VECTOR_INIT_INFO_EMPTY_INIT(sg_cpu_stats); \*(T> .fi .PP \fBInitialising Host-Info statistics vector description\fR .PP .nf \*(T< static void sg_os_stats_item_init(sg_os_stats *d); static void sg_os_stats_item_destroy(sg_os_stats *d); #define sg_os_stats_item_copy NULL #define sg_os_stats_item_compute_diff NULL #define sg_os_stats_item_compare NULL VECTOR_INIT_INFO_FULL_INIT(sg_os_stats); \*(T> .fi .PP \fBInitialising Disk-IO statistics vector description\fR .PP .nf \*(T< static void sg_disk_io_stats_item_init(sg_disk_io_stats *d); static sg_error sg_disk_io_stats_item_copy(sg_disk_io_stats *d, const sg_disk_io_stats *s); static sg_error sg_disk_io_stats_item_compute_diff(const sg_disk_io_stats *s, sg_disk_io_stats *d); static int sg_disk_io_stats_item_compare(const sg_disk_io_stats *a, const sg_disk_io_stats *b); static void sg_disk_io_stats_item_destroy(sg_disk_io_stats *d); VECTOR_INIT_INFO_FULL_INIT(sg_disk_io_stats); \*(T> .fi .SS "WORKING WITH VECTORS" To simplify the working with the vector management functions, some preprocessor macros are available. They are shown here as if they were functions to ease understanding. .PP 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fItype\fR, size_t \fIblock_size\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR, size_t \fInew_count\fR, identifier \fItype\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIvectorptr\fR, size_t \fInew_count\fR, datatype *\fIdata\fR, identifier \fIdatatype\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .PP \*(T<\fBVECTOR_CREATE\fR\*(T>() calls \*(T<\fBsg_vector_create\fR\*(T>() with \*(T and \*(T using the vector specialisation \*(T. .PP \*(T<\fBVECTOR_CLEAR\fR\*(T>() simply calls \*(T<\fBsg_vector_clear\fR\*(T>(). This macro exists only for conformity. .PP \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() calls \*(T<\fBsg_vector_create\fR\*(T>() when the given vector pointer points to \*(T or \*(T<\fBsg_vector_resize\fR\*(T>() otherwise. The result of the appropriate function is returned. .PP \*(T<\fBVECTOR_UPDATE\fR\*(T>() calls \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() and sets data to the first element of the resulting vector when a non-NULL pointer got, to NULL otherwise. When \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() returns a NULL pointer and \*(T is not equal to 0 (zero), the intructions from the macro \*(T<\fBVECTOR_UPDATE_ERROR_CLEANUP\fR\*(T> are executed to cleanup before returning from current subroutine with the error which has been occurred. .PP \*(T<\fBVECTOR_ITEM_COUNT\fR\*(T>() returns 0 for a non-existing vector (\*(T == 0) and the number of containing elements otherwise. .SH "RETURN VALUES" Beside error codes, the return values, if any, are always a pointer to vector structures (struct \*(T *). .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_init.3000644 001750 001750 00000004160 12200045617 020660 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_init 3 2013-06-07 i-scream "" .SH NAME sg_init, sg_snapshot, sg_shutdown, sg_drop_privileges \- initialise libstatgrab .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(int \fIignore_init_errors\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_init\fR\*(T>() either initialises the statgrab library and sets the initialisation counter to 1, if not already done, or increases the initialisation counter. If called for the first time (in fact: if called when the initialisation counter is 0), the constructor (initialisation routine) of each registered component is invoked, some global variables are initialised, requested mutual exclusion semaphores are initialised and so on. \*(T<\fBsg_init\fR\*(T>() is protected by the mutex named "statgrab". .PP \*(T<\fBsg_snapshot\fR\*(T>() is Win32 only and will probably disappear. .PP \*(T<\fBsg_shutdown\fR\*(T>() decrements the initialisation counter. If the counter reaches zero, components' destructors are called, mutual exclusion semaphores (exept "statgrab") are destroyed etc. \*(T<\fBsg_shutdown\fR\*(T>() is protected by the mutex named "statgrab". .PP \*(T<\fBsg_drop_privileges\fR\*(T>() drops elevated privileges. .SH "RETURN VALUES" All functions return a statgrab error code. Either SG_ERROR_NONE when everything was ok or the appropriate error code from an constructor/destructor. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_process_stats_r.3000644 001750 001750 00000026125 12200045617 023776 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_process_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_process_stats, sg_get_process_stats_r, sg_get_process_count, sg_get_process_count_of, sg_get_process_count_r, sg_free_process_count, sg_process_compare_name, sg_process_compare_pid, sg_process_compare_uid, sg_process_compare_gid, sg_process_compare_size, sg_process_compare_res, sg_process_compare_cpu, sg_process_compare_time \- get process statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count_source \fIpcs\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats const *\fIwhereof\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_process_stats\fR\*(T> functions provide statistics about the currently running processes. Both functions, \*(T<\fBsg_get_process_stats\fR\*(T>() and \*(T<\fBsg_get_process_stats_r\fR\*(T>(), take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The functions \*(T<\fBsg_get_process_count_of\fR\*(T>() and \*(T<\fBsg_get_process_count_r\fR\*(T>() provide an aggregated view of the process table - they deliver the amount of processes per process state. The \*(T<\fBsg_get_process_count\fR\*(T>() is in fact a preprocessor macro for backward compatibility and calls \*(T<\fBsg_get_process_count_of\fR\*(T>() with the parameter \*(T of sg_entire_process_count to emulate the behavior until 0.17. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_process_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_process_count_of T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_count_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_process_stats_r\fR\*(T>() or the \*(T summaries received from \*(T<\fBsg_get_process_count_r\fR\*(T> must be freed using \*(T<\fBsg_free_process_stats\fR\*(T>() or \*(T<\fBsg_free_process_count\fR\*(T>(), respectively. The caller is responsible for doing it when the data isn't needed any more. .PP \*(T<\fBsg_process_compare_name\fR\*(T> .br \*(T<\fBsg_process_compare_pid\fR\*(T> .br \*(T<\fBsg_process_compare_uid\fR\*(T> .br \*(T<\fBsg_process_compare_gid\fR\*(T> .br \*(T<\fBsg_process_compare_size\fR\*(T> .br \*(T<\fBsg_process_compare_res\fR\*(T> .br \*(T<\fBsg_process_compare_cpu\fR\*(T> .br \*(T<\fBsg_process_compare_time\fR\*(T> .PP These functions compare two sg_process_stats entries, and return an int to represent which one is greater. The main use of these functions is to be passed to qsort to sort the sg_process_stats by the given type. \fBExample\fR .PP .nf \*(T< size_t entries; sg_process_stats *proc_stats = NULL; while( NULL != ( proc_stats = sg_get_process_stats_r(&entries) ) ) { /* order entries by comparing the process identifier */ qsort( proc_stats, entries, sizeof(proc_stats[0]), &sg_process_compare_pid ); show_proc_stats( proc_stats ); sg_free_process_stats( proc_stats ); } \*(T> .fi .SH "RETURN VALUES" The structure returned by sg_get_process_stats is of type \*(T. .PP .nf \*(T< typedef struct { char *process_name; char *proctitle; pid_t pid; /* process identifier */ pid_t parent; /* Parent pid */ pid_t pgid; /* process id of process group leader */ pid_t sessid; /* session id of the session the process belongs to */ uid_t uid; uid_t euid; gid_t gid; gid_t egid; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long proc_size; /* in bytes */ unsigned long long proc_resident; /* in bytes */ time_t start_time; /* When was the process started */ time_t time_spent; /* time running in seconds */ double cpu_percent; int nice; sg_process_state state; time_t systime; } sg_process_stats; \*(T> .fi .PP .nf \*(T< typedef enum { SG_PROCESS_STATE_RUNNING, SG_PROCESS_STATE_SLEEPING, SG_PROCESS_STATE_STOPPED, SG_PROCESS_STATE_ZOMBIE, SG_PROCESS_STATE_UNKNOWN } sg_process_state; \*(T> .fi .TP \*(T The name of the command that was run. The content of this field heavily depends on the underlying operating system, some store the basename the executable passes to the \*(T<\fBexec\fR\*(T>(2) system call, some the entire path. Most OS restrict the size of this field - some like the *BSD family to a very low value of 15 bytes. This field is usually immutable for userland processes. .TP \*(T The command line (the "title") of the process. Take note - this can be modified by the process, so isn't guaranteed to be the original command line. .TP \*(T The process ID. .TP \*(T The parent process ID. .TP \*(T The process ID of the process group leader. .TP \*(T Session id of the session the process belongs to. .TP \*(T The ID of the user the process is running as. .TP \*(T The ID of the effective user the process is running as. .TP \*(T The ID of the group the process is running as. .TP \*(T The ID of the effective group the process is running as. .TP \*(T The number of context switches of this process (voluntary and involuntary). .TP \*(T The number of voluntary context switches of this process (eg. by calling \*(T<\fBsched_yield\fR\*(T>() or \*(T<\fBsleep\fR\*(T>()). .TP \*(T The number of involuntary context switches of this process (eg. time slice exhausted or signal sent). .TP \*(T The virtual memory size of the process in bytes. .TP \*(T The size of the process that's resident in memory. .TP \*(T The time when the process has been started in seconds since epoch. .TP \*(T The number of seconds the process has been running (user+system time, without time spent by child processes). .TP \*(T The current percentage of CPU the process is using. .TP \*(T The nice value of the process. .TP \*(T The current state of the process. See sg_process_state for permitted values. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. This might be (but doesn't have to be) the same moment for all returned entries, regardless whether they're fetched with one snapshot or puzzled from some kind of procfs. .PP The structure returned by sg_get_process_count_of and sg_get_process_count_r is of type \*(T. .PP .nf \*(T< typedef enum sg_process_count_source { sg_entire_process_count, sg_last_process_count } sg_process_count_source; \*(T> .fi .PP .nf \*(T< typedef struct{ unsigned long long total; unsigned long long running; unsigned long long sleeping; unsigned long long stopped; unsigned long long zombie; unsigned long long unknown; time_t systime; }sg_process_count; \*(T> .fi .TP \*(T The total number of processes. .TP \*(T The number of running processes. .TP \*(T The number of sleeping processes. .TP \*(T The number of stopped processes. .TP \*(T The number of zombie processes. .TP \*(T The number of processes not matching any of above named categories. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. .SH BUGS The very first call of \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_last_process_count) will return the same as \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_entire_process_count). .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_vector_clone_into.3000644 001750 001750 00000027361 12200045617 023440 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_vector_create 3 2013-06-07 i-scream "" .SH NAME sg_vector_create, sg_vector_clear, sg_vector_resize, sg_vector_free, sg_vector_clone, sg_vector_clone_into, sg_vector_compute_diff, sg_prove_vector, sg_get_nelements, sg_free_stats_buf \- statgrab vector management .SH SYNOPSIS 'nh .nf \*(T<#include "statgrab.h" #include "vector.h"\*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t \fIblock_size\fR, size_t \fIalloc_count\fR, size_t \fIinitial_used\fR, const sg_vector_init_info * const \fIinfo\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const struct sg_vector *\fIsrc\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIdest\fR, const struct sg_vector *\fIsrc\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIdest\fR, const struct sg_vector *\fIcur_vector\fR, const struct sg_vector *\fIlast_vector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const struct sg_vector *\fIvec\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_vector_create\fR\*(T>() allocates and initialises a new statgrab vector with \*(T elements ready for use. Space for \*(T elements is initially allocated (to avoid too many calls to \*(T<\fBrealloc\fR\*(T>() during later \*(T<\fBsg_vector_resize\fR\*(T>() calls). The value of \*(T must be a power of 2, it's rounded up to the next power of 2 when it's not. If \*(T is not a multiple of \*(T, it's rounded up to the next multiple of \*(T. It returns a pointer to the newly created vector. .PP \*(T<\fBsg_vector_clear\fR\*(T>() destroys all elements contained in the given vector. In opposite to \*(T<\fBsg_vector_resize\fR\*(T>( x, 0 ) the allocated size of the vector remains untouched. .PP \*(T<\fBsg_vector_resize\fR\*(T>() increases or decreases the amount of allocated elements in the specified vector. The amount of allocated elements is always a multiple of the intialisation parameter \*(T. In the special case, \*(T<\fBsg_vector_resize\fR\*(T>() is called with 0 in argument \*(T, the vector is freed after all vector elements had been destroyed. It returns the pointer to the resized vector. .PP \*(T<\fBsg_vector_free\fR\*(T>() destroys all vector elements and deallocates the storage belonging to the given vector. .PP \*(T<\fBsg_vector_clone\fR\*(T>() clones all elements of the given vector into a new vector created with the same specification as the referenced one. It returns a pointer to the cloned vector. .PP \*(T<\fBsg_vector_clone_into\fR\*(T>() clones all elements of the given source vector into the given target vector. The target vector must be created for the same element data type as the source vector. It returns an error code != to SG_ERROR_NONE if something went wrong. .PP \*(T<\fBsg_vector_compute_diff\fR\*(T>() computes a difference vector between the vector containing current statistics and another vector containing older statistics. If an element exists in the current vector but not in the opposite one, it's cloned into the result vector. If an element exists only in the opposite vector, it doesn't appear in the target vector. \*(T<\fBsg_vector_compute_diff\fR\*(T>() returns an error code != to SG_ERROR_NONE if something went wrong. .PP \*(T<\fBsg_prove_vector\fR\*(T>() proves whether a pointer to a vector really points to a vector. In case the given vector pointer points to corrupted data, the program is aborted. When \*(T<\fBsg_prove_vector\fR\*(T>() returns, it returns SG_ERROR_NONE. .PP \*(T<\fBsg_get_nelements\fR\*(T>() returns the number of elements the given data area, encompasses by a statgrab vector, contains. The vector head is internally calculated from the given pointer to the first vector element. .PP \*(T<\fBsg_free_stats_buf\fR\*(T>() frees the vector emcompassing the given data area. .SH NOTES Except \*(T<\fBsg_get_nelements\fR\*(T>() and \*(T<\fBsg_free_stats_buf\fR\*(T>() none of above functions can be called from outside of the libstatgrab sources. The documented structures and APIs may change without warning. The description of all other API is intended to be read from libstatgrab developers only. .PP Each vector is created from two elements: the vector information and the list of elements: .nf \*(T< template struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; Impl vector_implementation; T elements[alloc_count]; }; \*(T> .fi Of course, it is not valid C, so being tricky was the solution: .nf \*(T< typedef struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; struct sg_vector_init_info info; } sg_vector; struct sg_vector_size_helper { struct sg_vector v; long long ll; }; #define VECTOR_SIZE offsetof(struct sg_vector_size_helper,ll) /* Return the data ptr of a vector */ #define VECTOR_DATA(vector) \e (vector ? (void *)(((char *)vector)+VECTOR_SIZE) : NULL) #define VECTOR_ADDR_ARITH(ptr) \e (sg_vector *)(((char *)(ptr))\-VECTOR_SIZE) /* Return the vector for a data */ #define VECTOR_ADDRESS(ptr) \e ((ptr) ? (SG_ERROR_NONE == sg_prove_vector(VECTOR_ADDR_ARITH(ptr)) ? VECTOR_ADDR_ARITH(ptr) : NULL ) : NULL) \*(T> .fi .PP This also allows user functions as \*(T<\fBsg_get_nelements\fR\*(T>() and \*(T<\fBsg_free_stats_buf\fR\*(T>() to switch easily between the vector structure and the content. .SS "THE VECTOR SPECIALISATION STRUCTURE" As mentioned, the vector implementation uses strategies from the object oriented programming concept named "polymorphism". A vector is described by a small object containing inherent attributes like element size and a bunch of "virtual methods" to do element related tasks like initialising or destroying elements. .PP .nf \*(T< typedef void (*vector_init_function)(void *item); typedef sg_error (*vector_copy_function)(const void *src, void *dst); typedef sg_error (*vector_compute_diff_function)(void *dst, const void *src); typedef int (*vector_compare_function)(const void *a, const void *b); typedef void (*vector_destroy_function)(void *item); struct sg_vector_init_info { size_t item_size; vector_init_function init_fn; vector_copy_function copy_fn; vector_compute_diff_function compute_diff_fn; vector_compare_function compare_fn; vector_destroy_function destroy_fn; }; \*(T> .fi .PP The instances of struct \*(T are conceptional statically initialised by using either the preprocessor macro \*(T<\fBVECTOR_INIT_INFO_FULL_INIT\fR\*(T>(\*(T) or \*(T<\fBVECTOR_INIT_INFO_EMPTY_INIT\fR\*(T>(\*(T). Here're some examples to demonstrate how it's meant: \fBInitialising CPU statistics vector description\fR .PP .nf \*(T< VECTOR_INIT_INFO_EMPTY_INIT(sg_cpu_stats); \*(T> .fi .PP \fBInitialising Host-Info statistics vector description\fR .PP .nf \*(T< static void sg_os_stats_item_init(sg_os_stats *d); static void sg_os_stats_item_destroy(sg_os_stats *d); #define sg_os_stats_item_copy NULL #define sg_os_stats_item_compute_diff NULL #define sg_os_stats_item_compare NULL VECTOR_INIT_INFO_FULL_INIT(sg_os_stats); \*(T> .fi .PP \fBInitialising Disk-IO statistics vector description\fR .PP .nf \*(T< static void sg_disk_io_stats_item_init(sg_disk_io_stats *d); static sg_error sg_disk_io_stats_item_copy(sg_disk_io_stats *d, const sg_disk_io_stats *s); static sg_error sg_disk_io_stats_item_compute_diff(const sg_disk_io_stats *s, sg_disk_io_stats *d); static int sg_disk_io_stats_item_compare(const sg_disk_io_stats *a, const sg_disk_io_stats *b); static void sg_disk_io_stats_item_destroy(sg_disk_io_stats *d); VECTOR_INIT_INFO_FULL_INIT(sg_disk_io_stats); \*(T> .fi .SS "WORKING WITH VECTORS" To simplify the working with the vector management functions, some preprocessor macros are available. They are shown here as if they were functions to ease understanding. .PP 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fItype\fR, size_t \fIblock_size\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR, size_t \fInew_count\fR, identifier \fItype\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIvectorptr\fR, size_t \fInew_count\fR, datatype *\fIdata\fR, identifier \fIdatatype\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .PP \*(T<\fBVECTOR_CREATE\fR\*(T>() calls \*(T<\fBsg_vector_create\fR\*(T>() with \*(T and \*(T using the vector specialisation \*(T. .PP \*(T<\fBVECTOR_CLEAR\fR\*(T>() simply calls \*(T<\fBsg_vector_clear\fR\*(T>(). This macro exists only for conformity. .PP \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() calls \*(T<\fBsg_vector_create\fR\*(T>() when the given vector pointer points to \*(T or \*(T<\fBsg_vector_resize\fR\*(T>() otherwise. The result of the appropriate function is returned. .PP \*(T<\fBVECTOR_UPDATE\fR\*(T>() calls \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() and sets data to the first element of the resulting vector when a non-NULL pointer got, to NULL otherwise. When \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() returns a NULL pointer and \*(T is not equal to 0 (zero), the intructions from the macro \*(T<\fBVECTOR_UPDATE_ERROR_CLEANUP\fR\*(T> are executed to cleanup before returning from current subroutine with the error which has been occurred. .PP \*(T<\fBVECTOR_ITEM_COUNT\fR\*(T>() returns 0 for a non-existing vector (\*(T == 0) and the number of containing elements otherwise. .SH "RETURN VALUES" Beside error codes, the return values, if any, are always a pointer to vector structures (struct \*(T *). .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_network_io_stats_diff_between.3000644 001750 001750 00000014226 12200045617 026657 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_network_io_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_network_io_stats, sg_get_network_io_stats_r, sg_get_network_io_stats_diff, sg_get_network_io_stats_diff_between, sg_free_network_io_stats, sg_network_io_compare_name \- get network statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_network_io_stats *\fIcur\fR, const sg_network_io_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_network_iface_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_network_io_stats\fR\*(T> functions provide network interface I/O statistics on a per interface basis. All get- and diff-functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The \*(T<\fBsg_get_network_io_stats\fR\*(T>() and \*(T<\fBsg_get_network_io_stats_r\fR\*(T>() functions deliver the I/O-statistics since the interface has been attached to the system. The \*(T<\fBsg_get_network_io_stats_diff\fR\*(T>() and \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T>() deliver the difference between two calls of \*(T<\fBsg_get_network_io_stats\fR\*(T>() or \*(T<\fBsg_get_network_io_stats_r\fR\*(T>(), respectively. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_network_io_stats T} T{ sg_network_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_network_io_stats_r T} T{ sg_network_io_stats * T} T{ caller T} T{ sg_get_network_io_stats_diff T} T{ sg_network_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_network_io_stats_diff_between T} T{ sg_network_io_stats * T} T{ caller T} .TE .PP \*(T vectors received from \*(T<\fBsg_get_network_io_stats_r\fR\*(T>() or \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_network_io_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .PP Additionally a support function for \*(T<\fBqsort\fR\*(T>(3) are available: \*(T<\fBsg_network_io_compare_name\fR\*(T>(). \fBExample\fR .PP .nf \*(T< size_t entries; sg_network_io_stats *network_stats = NULL; while( NULL != ( network_stats = sg_get_network_io_stats_diff(&entries) ) ) { /* sort interface by name */ qsort( network_stats, entries, sizeof(network_stats[0]), &sg_network_io_compare_name ); show_network_io_stats( network_stats ); } \*(T> .fi .PP \*(T<\fBsg_get_network_io_stats\fR\*(T> returns the network traffic stored in the kernel which holds the amount of data transferred since device was attached. On some platforms, such as Solaris 7, this value is stored in a 32bit int, so wraps around when it reaches 4GB. Other platforms, such as Solaris 8, hold the value in a 64bit int, which wraps somewhere near 17 million terabytes. The \*(T<\fBsg_get_network_io_stats_diff\fR\*(T>() function and the \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T>() function care about these overflows and try to detect overflows when the diff is calculated. .SH "RETURN VALUES" All network statistics return a pointer to a structure of type \*(T. .PP .nf \*(T< typedef struct { char *interface_name; unsigned long long tx; unsigned long long rx; unsigned long long ipackets; unsigned long long opackets; unsigned long long ierrors; unsigned long long oerrors; unsigned long long collisions; time_t systime; } sg_network_io_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be eth0, on AIX en0 and on FreeBSD fxp0) .TP \*(T The number of bytes transmitted. .TP \*(T The number of bytes received. .TP \*(T The number of packets received. .TP \*(T The number of packets transmitted. .TP \*(T The number of receive errors. .TP \*(T The number of transmit errors. .TP \*(T The number of collisions. .TP \*(T The timestamp when the above stats where collected in seconds since epoch or the time period over which \*(T and \*(T were transferred. .SH BUGS \*(T<\fBsg_get_network_io_stats_diff\fR\*(T> and \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T> compare two lists of network interface related I/O statistics. Each entry occurring only in the second list is passed through to the resulting list as if it would have been compared to an entry with all statistic values set to 0. This implies, on the very first call \*(T<\fBsg_get_network_io_stats_diff\fR\*(T> will return the same as \*(T<\fBsg_get_network_io_stats\fR\*(T>. .PP On operating systems that hold only 32bits of data there is a problem if the values wrap twice. For example, on Solaris 7 if 9GB is transferred and the operating system wraps at 4GB, the \*(T<\fBsg_get_network_io_stats_diff\fR\*(T> function will return 5GB. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_str_error.3000644 001750 001750 00000007477 12200045616 021753 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_error 3 2013-06-07 i-scream "" .SH NAME sg_get_error, sg_get_error_arg, sg_get_error_errno, sg_str_error, sg_get_error_details, sg_strperror \- get last error status .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error_details *\fIerr_details\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error \fIcode\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(char **\fIbuf\fR, const sg_error_details * const \fIerr_details\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION There are four functions to get information about the last occurred error: \*(T<\fBsg_get_error\fR\*(T>, \*(T<\fBsg_get_error_arg\fR\*(T>, \*(T<\fBsg_get_error_errno\fR\*(T> and \*(T<\fBsg_get_error_details\fR\*(T>. The remaining functions are intended to improve the machine-human-interface (e.g. the error log or a message box): \*(T<\fBsg_str_error\fR\*(T> delivers a human readable error name and \*(T<\fBsg_strperror\fR\*(T> prepares a full blown error message for printing. .PP The error argument (\*(T<\fBsg_get_error_arg\fR\*(T>) is stored thread local and is reused every time an error occures. If a later usage is intended, duplicating it is a suitable strategy. Same for the \*(T of \*(T delivered by \*(T<\fBsg_get_error_details\fR\*(T>. .PP When someone calls the function \*(T<\fBsg_get_error_details\fR\*(T> with a NULL pointer, the last error is overridden with a new one describing that \*(T<\fBsg_get_error_details\fR\*(T> is called with invalid arguments. Please be careful. .PP The function \*(T<\fBsg_strperror\fR\*(T> is allowed to be called with or without (\*(T is NULL) collected error details. In the latter case, the last occurred error of this thread is used to prepare the error message. Be aware, the the buffer pointer must be non-NULL (points to an existing \*(T lvalue), but the \*(T lvalue it points to, must be NULL. When invoked correctly, there are only two possible error conditions let \*(T<\fBsg_strperror\fR\*(T> fail: ENOMEM (out of memory) and EINVAL (invalid error code). \fBExample\fR .PP .nf \*(T< if( NULL == sg_get_cpu_stats() ) { char *buf = NULL; if( NULL != sg_strperror( &buf, NULL ) ) { fprintf( stderr, "error getting CPU stats: %s\en", buf ); free(buf); exit(255); } else { fprintf( stderr, "error getting CPU stats and error information\en" ); exit(255); } } \*(T> .fi .SH "RETURN VALUES" The error details contains following information: .PP .nf \*(T< typedef struct sg_error_details { sg_error error; int errno_value; const char *error_arg; } sg_error_details; \*(T> .fi .TP \*(T The statgrab library error code. .TP \*(T The operating system error code. .TP \*(T Additional information set when the error was reported. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_disk_io_compare_traffic.3000644 001750 001750 00000014326 12200045616 024546 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_disk_io_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_disk_io_stats, sg_get_disk_io_stats_r, sg_get_disk_io_stats_diff, sg_get_disk_io_stats_diff_between, sg_free_disk_io_stats, sg_disk_io_compare_name, sg_disk_io_compare_traffic \- get disk io statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_disk_io_stats *\fIcur\fR, const sg_disk_io_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_disk_io_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_disk_io_stats\fR\*(T> functions provide disk I/O statistics on a per disk basis. All get- and diff-functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The \*(T<\fBsg_get_disk_io_stats\fR\*(T>() and \*(T<\fBsg_get_disk_io_stats_r\fR\*(T>() functions deliver the I/O-statistics since the disk has been attached to the system. The \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T>() and \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T>() deliver the difference between two calls of \*(T<\fBsg_get_disk_io_stats\fR\*(T>() or \*(T<\fBsg_get_disk_io_stats_r\fR\*(T>(), respectively. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_disk_io_stats T} T{ sg_disk_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_disk_io_stats_r T} T{ sg_disk_io_stats * T} T{ caller T} T{ sg_get_disk_io_stats_diff T} T{ sg_disk_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_disk_io_stats_diff_between T} T{ sg_disk_io_stats * T} T{ caller T} .TE .PP \*(T vectors got from \*(T<\fBsg_get_disk_io_stats_r\fR\*(T>() or \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_disk_io_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .PP Additionally two support functions for \*(T<\fBqsort\fR\*(T>(3) are available: \*(T<\fBsg_disk_io_compare_name\fR\*(T>() and \*(T<\fBsg_disk_io_compare_traffic\fR\*(T>(). \fBExample\fR .PP .nf \*(T< size_t entries; sg_disk_io_stats *io_stats = NULL; while( NULL != ( io_stats = sg_get_disk_io_stats_diff(&entries) ) ) { /* show disks with most traffic first */ qsort( io_stats, entries, sizeof(io_stats[0]), &sg_disk_io_compare_traffic ); show_disk_io_stats( io_stats ); } \*(T> .fi .PP On some platforms, such as Solaris 7, the kernel value is stored in a 32bit int, so wraps around when it reaches 4GB. Other platforms, such as Solaris 8 (and most other modern systems), hold the value in a 64bit int, which wraps somewhere near 17 million terabytes. The \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T>() function and the \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T>() function care about these overflows and try to detect overflows when the diff is calculated. .PP On Solaris libstatgrab will attempt to get the cXtXdXsX representation for the \*(T string. If it fails it will use a name like sd0. On some systems programs calling libstatgrab will need elevated privileges to lookup some of the names. The mappings are built up when \*(T<\fBsg_init\fR\*(T>() is called for the first time. .SH "RETURN VALUES" All diskio statistics return a pointer to a structure of type \*(T. .PP .nf \*(T< typedef struct { char *disk_name; unsigned long long read_bytes; unsigned long long write_bytes; time_t systime; } sg_disk_io_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be hda) .TP \*(T The number of bytes the disk has read. .TP \*(T The number of bytes the disk has written. .TP \*(T The time period over which \*(T and \*(T were transferred. .SH BUGS \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T> and \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T> compare two lists of disk (block device) related I/O statistics. Each entry occurring only in the second list is passed through to the resulting list as if it would have been compared to an entry with all statistic values set to 0. This implies, on the very first call \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T> will return the same as \*(T<\fBsg_get_disk_io_stats\fR\*(T>. .PP On operating systems that hold only 32bits of data there is a problem if the values wrap twice. For example, on Solaris 7 if 9GB is transferred and the operating system wraps at 4GB, the \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T>() function will return 5GB. .PP The compare functions exists rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_global_lock.3000644 001750 001750 00000026613 12200045620 022166 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_comp_init 3 2013-06-07 i-scream "" .SH NAME sg_comp_init, sg_comp_destroy, sg_comp_get_tls, sg_global_lock, sg_global_unlock \- managing system statistics delivery .SH SYNOPSIS 'nh .nf \*(T<#include "tools.h"\*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(unsigned int \fIid\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_comp_init\fR\*(T>() is called by \*(T<\fBsg_init\fR\*(T>() to run the initialisation for the globals component and each registered libstatgrab component. This registration is done statically by appending a component initialisation information structure (instance-of \*(T) to the \*(T list in \*(T<\fIsrc/libstatgrab/globals.c\fR\*(T>. The instance of \*(T is usually defined by using one of \*(T<\fBEASY_COMP_SETUP\fR\*(T>() or \*(T<\fBEXTENDED_COMP_SETUP\fR\*(T>(), respectively. .PP \*(T<\fBsg_comp_destroy\fR\*(T>() is called by \*(T<\fBsg_shutdown\fR\*(T>() to destroy all global resources, eg. translation tables for device names or compiled regular expressions to match path names etc. Statistics resources are managed somewhere else and are freed (conceptually and usually) before \*(T<\fBsg_comp_destroy\fR\*(T>() is invoked. .PP \*(T<\fBsg_comp_get_tls\fR\*(T>() is the internal function to access the thread local storage (formerly static globals) of the component. Usually it's easier to rely on the encapsulating macro \*(T<\fBGLOBAL_GET_TLS\fR\*(T>(). .SH NOTES Delivering system statistics is the job of libstatgrab, managing the delivery is the job of the globals component. To fulfil this job, the components to manage must be prepared: .TP 0.4i 1. declare component's global and TLS data structure (probably only on paper, not in code) .TP 0.4i 2. define global initialisation, thread destruction and process destruction functions (if required by 1.) .TP 0.4i 3. define component information structure using \*(T<\fB*_COMP_SETUP\fR\*(T>() .TP 0.4i 4. define component accessors using one or more of \*(T<\fBEASY_COMP_ACCESS\fR\*(T>() .br \*(T<\fBEASY_COMP_DIFF\fR\*(T>() .br \*(T<\fBMULTI_COMP_ACCESS\fR\*(T>() .br \*(T<\fBMULTI_COMP_DIFF\fR\*(T>() .PP When having done these steps, a new component delivering new statistics is born and needs to be "announced". Assuming the component is named \fIcpu\fR, append the line \*(T<{ &sg_cpu_init, 0 }\*(T> to above named \*(T list. .PP Component initialisation information in detail: .nf \*(T< typedef sg_error (*comp_global_init_function)(unsigned id); typedef void (*comp_global_destroy_function)(void); typedef void (*comp_global_cleanup_function)(void *); struct sg_comp_status { sg_error init_error; }; struct sg_comp_init { comp_global_init_function init_fn; comp_global_destroy_function destroy_fn; comp_global_cleanup_function cleanup_fn; size_t static_buf_size; #if defined(ENABLE_THREADS) && defined(HAVE_PTHREAD) const char **required_locks; #endif struct sg_comp_status *status; }; \*(T> .fi Components which do not need something special can rely on \*(T<\fBEASY_COMP_SETUP\fR\*(T>(): \fBInitialising memory component\fR .PP .nf \*(T< EASY_COMP_SETUP(mem,1,NULL); \*(T> .fi When own initialisation is needed, doing it is a bit more complex: \fBInitialising network component\fR .PP .nf \*(T< #define SG_NETWORK_IO_NOW_IDX 0 #define SG_NETWORK_IO_DIFF_IDX 1 #define SG_NETWORK_IFACE_IDX 2 #define SG_NETWORK_MAX_IDX 3 EXTENDED_COMP_SETUP(network,SG_NETWORK_MAX_IDX,NULL); #ifdef LINUX static regex_t network_io_rx; #define RX_MATCH_COUNT (8+1) #endif sg_error sg_network_init_comp(unsigned id) { GLOBAL_SET_ID(network,id); #ifdef LINUX if( regcomp( &network_io_rx, ..., REG_EXTENDED)!=0) { return sg_set_error(SG_ERROR_PARSE, NULL); } #endif return SG_ERROR_NONE; } void sg_network_destroy_comp(void) { #ifdef LINUX regfree(&network_io_rx); #endif } EASY_COMP_CLEANUP_FN(network,SG_NETWORK_MAX_IDX) \*(T> .fi .SS "MACROS TO WORK WITH THE COMPONENT MANAGER" To simplify working with the component management functions, some preprocessor macros are available. They are shown here as if they were functions to ease understanding. .PP 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, \fI...\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, size_t \fInvect\fR, \fI...\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, size_t \fInvect\fR, \fI...\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, unsigned int \fIid\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, size_t \fInvect\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIfn\fR, identifier \fIcomp\fR, identifier \fIstat\fR, size_t \fIidx\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIfn\fR, identifier \fIcomp\fR, identifier \fIstat\fR, size_t \fIidx\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIfn\fR, identifier \fIgetfn\fR, identifier \fIcomp\fR, identifier \fIstat\fR, size_t \fIdiffidx\fR, size_t \fInowidx\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIfn\fR, identifier \fIgetfn\fR, identifier \fIcomp\fR, identifier \fIstat\fR, size_t \fIdiffidx\fR, size_t \fInowidx\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .PP \*(T<\fBEASY_COMP_SETUP\fR\*(T>() cares about anything to be automatically done for instantiating a component information structure for the specified component \*(T. The created TLS storage structure will hold \*(T pointer elements and that's it. All initialisation, destruction and cleanup-routines are created as needed using \*(T<\fBEASY_COMP_INIT_FN\fR\*(T>(), \*(T<\fBEASY_COMP_DESTROY_FN\fR\*(T>() and \*(T<\fBEASY_COMP_CLEANUP_FN\fR\*(T>(). After the amount of required vector pointers to be stored the list of required mutexes must be specified, finished with a NULL pointer. .PP \*(T<\fBEXTENDED_COMP_SETUP\fR\*(T>() cares about anything to be automatically done for instantiating an component information structure for the specified component \*(T but the required defintion of the initialisation, destruction and cleanup routines. The created TLS storage structure will hold \*(T pointer elements and that's it. After the amount of required vector pointers to be stored, the list of required mutexes must be specified, finished with a NULL pointer. All standard routines can be created semi-automatically using \*(T<\fBEASY_COMP_INIT_FN\fR\*(T>(), \*(T<\fBEASY_COMP_DESTROY_FN\fR\*(T>() and \*(T<\fBEASY_COMP_CLEANUP_FN\fR\*(T>(). .PP \*(T<\fBDEFAULT_INIT_COMP\fR\*(T>() just declares the prototypes for the initialisation, destruction and cleanup routines, defines the initialisation status buffer, lock-names list and finally fills the component initialisation structure. Use this when your TLS storage contains not only vector pointers. .PP \*(T<\fBGLOBAL_GET_TLS\fR\*(T>() returns the pointer to the component's \fIthread local storage\fR. .PP \*(T<\fBGLOBAL_SET_ID\fR\*(T>() stores the component identifier, required eg. to access its TLS. .PP \*(T<\fBEASY_COMP_INIT_FN\fR\*(T>() defines a default component initialisation routine. It stores the component identifier and returns with SG_ERROR_NONE. .PP \*(T<\fBEASY_COMP_DESTROY_FN\fR\*(T>() defines a default component destructor, called at the end of the entire process (or when the last \*(T<\fBsg_shutdown\fR\*(T>() is called). The default destructor does nothing and usually an individual initialisation routine requires an individual destructor, too. .PP \*(T<\fBEASY_COMP_CLEANUP_FN\fR\*(T>() defines a default TLS cleanup routine, always called when a thread ends to free vectors held in \fIthread local storage\fR. .PP \*(T<\fBEASY_COMP_ACCESS\fR\*(T>() defines accessors to a specific statistic containing one element provided by the component: the functions \*(T<\fBfn\fR\*(T>() and the \*(T<\fBfn##_r\fR\*(T>(). The following function must exists: 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_vector *\fIname##_vect\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy It accesses the vector idx from TLS of component \*(T and returns sg_##name##_stats. It manages all standard things like memory and error management, return value etc. .PP \*(T<\fBEASY_COMP_DIFF\fR\*(T>() returns the difference between the two statistic collection runs. The variant dealing with statgrab owned statistics return the difference between the content currently in the vector specified by \*(T and the resulting vector of \*(T<\fBgetfn\fR\*(T>(). The result is stored in the vector \*(T. If there is no current result, simply the result of \*(T<\fBgetfn\fR\*(T>() is returned. .PP \*(T<\fBMULTI_COMP_ACCESS\fR\*(T>() defines accessors to a specific statistic containing 0..n elements provided by the component: the functions \*(T<\fBfn\fR\*(T>() and the \*(T<\fBfn##_r\fR\*(T>(). The following function must exists: 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_vector **\fIname##_vect\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy It accesses the vector idx from TLS of component \*(T and returns sg_##name##_stats. It manages all standard things like memory and error anagement, return values, \*(T update, etc. .PP \*(T<\fBMULTI_COMP_DIFF\fR\*(T>() does the same as \*(T<\fBEASY_COMP_DIFF\fR\*(T>() but for vectors with more than one element. .SH "SEE ALSO" \fBlibstatgrab\fR(3) \fBsg_intro\fR(3) \fBsg_set_error\fR(3) \fBsg_comp_init\fR(3) \fBsg_vector_create\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_set_error_with_errno.3000644 001750 001750 00000003774 12200045620 024165 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_set_error 3 2013-06-07 i-scream "" .SH NAME sg_set_error, sg_set_error_with_errno, sg_set_error_with_errno_code, sg_clear_error \- sets the error condition .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error \fIcode\fR, const char *\fIarg\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error \fIcode\fR, const char *\fIarg\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error \fIcode\fR, const char *\fIarg\fR, int \fIerrno_value\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_set_error\fR\*(T>() sets the occurred error condition together with an argument. The argument is usually descriptive, eg. the file name which failed to open. .PP \*(T<\fBsg_set_error_with_errno\fR\*(T>() sets the occurred error condition together with an argument and the value of the system libraries \*(T value. The argument is usually descriptive, eg. the name of the failed \*(T<\fBsysctl\fR\*(T>() call. .PP \*(T<\fBsg_set_error_with_errno_code\fR\*(T>() sets the occurred error condition together with an argument and an error value of a system library call which doesn't set the \*(T value (eg. the pthread_* calls). The argument is usually descriptive, eg. the name of the mutex failed to get locked. .PP \*(T<\fBsg_clear_error\fR\*(T>() clears the current error condition. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_free_load_stats.3000644 001750 001750 00000004153 12200045616 023054 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_load_stats 3 2013-06-17 i-scream "" .SH NAME sg_get_load_stats, sg_get_load_stats_r, sg_free_load_stats \- get system load .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_load_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION These calls returns a pointer to a buffer containing information about cumulated machine load. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l l | l | l. T{ sg_get_load_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_load_stats_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_load_stats_r\fR\*(T>() must be freed using \*(T<\fBsg_free_load_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .PP On most systems this function is just a wrapper to the \*(T<\fBgetloadavg\fR\*(T> system call. .SH "RETURN VALUES" The structure returned is of type \*(T. .PP .nf \*(T< typedef struct{ double min1; double min5; double min15; time_t systime; }sg_load_stats; \*(T> .fi .TP \*(T The load average over 1 minute. .TP \*(T The load average over 5 minutes. .TP \*(T The load average over 15 minutes. .TP \*(T The timestamp when the above stats where collected in seconds since epoch .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_network_io_compare_name.3000644 001750 001750 00000014226 12200045617 024607 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_network_io_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_network_io_stats, sg_get_network_io_stats_r, sg_get_network_io_stats_diff, sg_get_network_io_stats_diff_between, sg_free_network_io_stats, sg_network_io_compare_name \- get network statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_network_io_stats *\fIcur\fR, const sg_network_io_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_network_iface_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_network_io_stats\fR\*(T> functions provide network interface I/O statistics on a per interface basis. All get- and diff-functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The \*(T<\fBsg_get_network_io_stats\fR\*(T>() and \*(T<\fBsg_get_network_io_stats_r\fR\*(T>() functions deliver the I/O-statistics since the interface has been attached to the system. The \*(T<\fBsg_get_network_io_stats_diff\fR\*(T>() and \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T>() deliver the difference between two calls of \*(T<\fBsg_get_network_io_stats\fR\*(T>() or \*(T<\fBsg_get_network_io_stats_r\fR\*(T>(), respectively. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_network_io_stats T} T{ sg_network_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_network_io_stats_r T} T{ sg_network_io_stats * T} T{ caller T} T{ sg_get_network_io_stats_diff T} T{ sg_network_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_network_io_stats_diff_between T} T{ sg_network_io_stats * T} T{ caller T} .TE .PP \*(T vectors received from \*(T<\fBsg_get_network_io_stats_r\fR\*(T>() or \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_network_io_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .PP Additionally a support function for \*(T<\fBqsort\fR\*(T>(3) are available: \*(T<\fBsg_network_io_compare_name\fR\*(T>(). \fBExample\fR .PP .nf \*(T< size_t entries; sg_network_io_stats *network_stats = NULL; while( NULL != ( network_stats = sg_get_network_io_stats_diff(&entries) ) ) { /* sort interface by name */ qsort( network_stats, entries, sizeof(network_stats[0]), &sg_network_io_compare_name ); show_network_io_stats( network_stats ); } \*(T> .fi .PP \*(T<\fBsg_get_network_io_stats\fR\*(T> returns the network traffic stored in the kernel which holds the amount of data transferred since device was attached. On some platforms, such as Solaris 7, this value is stored in a 32bit int, so wraps around when it reaches 4GB. Other platforms, such as Solaris 8, hold the value in a 64bit int, which wraps somewhere near 17 million terabytes. The \*(T<\fBsg_get_network_io_stats_diff\fR\*(T>() function and the \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T>() function care about these overflows and try to detect overflows when the diff is calculated. .SH "RETURN VALUES" All network statistics return a pointer to a structure of type \*(T. .PP .nf \*(T< typedef struct { char *interface_name; unsigned long long tx; unsigned long long rx; unsigned long long ipackets; unsigned long long opackets; unsigned long long ierrors; unsigned long long oerrors; unsigned long long collisions; time_t systime; } sg_network_io_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be eth0, on AIX en0 and on FreeBSD fxp0) .TP \*(T The number of bytes transmitted. .TP \*(T The number of bytes received. .TP \*(T The number of packets received. .TP \*(T The number of packets transmitted. .TP \*(T The number of receive errors. .TP \*(T The number of transmit errors. .TP \*(T The number of collisions. .TP \*(T The timestamp when the above stats where collected in seconds since epoch or the time period over which \*(T and \*(T were transferred. .SH BUGS \*(T<\fBsg_get_network_io_stats_diff\fR\*(T> and \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T> compare two lists of network interface related I/O statistics. Each entry occurring only in the second list is passed through to the resulting list as if it would have been compared to an entry with all statistic values set to 0. This implies, on the very first call \*(T<\fBsg_get_network_io_stats_diff\fR\*(T> will return the same as \*(T<\fBsg_get_network_io_stats\fR\*(T>. .PP On operating systems that hold only 32bits of data there is a problem if the values wrap twice. For example, on Solaris 7 if 9GB is transferred and the operating system wraps at 4GB, the \*(T<\fBsg_get_network_io_stats_diff\fR\*(T> function will return 5GB. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/statgrab.3000644 001750 001750 00000033363 12200045616 021041 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH libstatgrab 3 2013-06-07 i-scream "" .SH NAME statgrab, libstatgrab \- get system statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(int \fIignore_init_errors\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error \fIcode\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error_details *\fIerr_details\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(char **\fIbuf\fR, const sg_error_details * const \fIerr_details\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const char *\fImutex_name\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const char *\fImutex_name\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_percent_source \fIcps\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_cpu_stats *\fIwhereof\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_percents *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_cpu_stats *\fIcpu_now\fR, const sg_cpu_stats *\fIcpu_last\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_disk_io_stats *\fIcur\fR, const sg_disk_io_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_disk_io_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_fs_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const char *\fIvalid_fs\fR[]);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_host_info *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_load_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_mem_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_swap_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_network_iface_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_network_io_stats *\fIcur\fR, const sg_network_io_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_network_iface_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_page_stats *\fIcur\fR, const sg_page_stats *\fIlast\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_page_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count_source \fIpcs\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats const *\fIwhereof\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_user_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The statgrab library provides a cross-platform interface to get several system statistics. System statistics aren't standardised, so the statgrab library tries to choose the most important values over all supported operating systems. This implies that some values might not be available on every OS while some specific values are missing when there are no counterparts on any other OS. .PP The libstatgrab is organised in components, each for interrelated statistics. .TS allbox ; l | l. T{ component T} T{ statistics T} .T& l | l. T{ cpu T} T{ \*(T, \*(T T} T{ disk T} T{ \*(T, \*(T T} T{ load T} T{ \*(T T} T{ mem T} T{ \*(T T} T{ network T} T{ \*(T, \*(T T} T{ os T} T{ \*(T T} T{ page T} T{ \*(T T} T{ process T} T{ \*(T, \*(T T} T{ swap T} T{ \*(T T} T{ user T} T{ \*(T T} .TE .PP The library was originally written to support the i-scream central monitoring system, but has since become a standalone package. It has been ported to work on Linux, NetBSD, FreeBSD, OpenBSD, DragonFly BSD, Solaris, HP-UX, AIX and Cygwin. .SH "SEE ALSO" \fBsg_intro\fR(3) \fBsg_get_cpu_stats\fR(3) \fBsg_get_disk_io_stats\fR(3) \fBsg_get_fs_stats\fR(3) \fBsg_get_host_info\fR(3) \fBsg_get_load_stats\fR(3) \fBsg_get_mem_stats\fR(3) \fBsg_get_network_io_stats\fR(3) \fBsg_get_network_iface_stats\fR(3) \fBsg_get_page_stats\fR(3) \fBsg_get_process_stats\fR(3) \fBsg_get_swap_stats\fR(3) \fBsg_get_user_stats\fR(3) \fBsg_get_error\fR(3) \fBsg_internal-intro\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_set_error_with_errno_code.3000644 001750 001750 00000003774 12200045620 025157 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_set_error 3 2013-06-07 i-scream "" .SH NAME sg_set_error, sg_set_error_with_errno, sg_set_error_with_errno_code, sg_clear_error \- sets the error condition .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error \fIcode\fR, const char *\fIarg\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error \fIcode\fR, const char *\fIarg\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error \fIcode\fR, const char *\fIarg\fR, int \fIerrno_value\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_set_error\fR\*(T>() sets the occurred error condition together with an argument. The argument is usually descriptive, eg. the file name which failed to open. .PP \*(T<\fBsg_set_error_with_errno\fR\*(T>() sets the occurred error condition together with an argument and the value of the system libraries \*(T value. The argument is usually descriptive, eg. the name of the failed \*(T<\fBsysctl\fR\*(T>() call. .PP \*(T<\fBsg_set_error_with_errno_code\fR\*(T>() sets the occurred error condition together with an argument and an error value of a system library call which doesn't set the \*(T value (eg. the pthread_* calls). The argument is usually descriptive, eg. the name of the mutex failed to get locked. .PP \*(T<\fBsg_clear_error\fR\*(T>() clears the current error condition. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_nelements.3000644 001750 001750 00000027361 12200045617 022556 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_vector_create 3 2013-06-07 i-scream "" .SH NAME sg_vector_create, sg_vector_clear, sg_vector_resize, sg_vector_free, sg_vector_clone, sg_vector_clone_into, sg_vector_compute_diff, sg_prove_vector, sg_get_nelements, sg_free_stats_buf \- statgrab vector management .SH SYNOPSIS 'nh .nf \*(T<#include "statgrab.h" #include "vector.h"\*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t \fIblock_size\fR, size_t \fIalloc_count\fR, size_t \fIinitial_used\fR, const sg_vector_init_info * const \fIinfo\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const struct sg_vector *\fIsrc\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIdest\fR, const struct sg_vector *\fIsrc\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIdest\fR, const struct sg_vector *\fIcur_vector\fR, const struct sg_vector *\fIlast_vector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const struct sg_vector *\fIvec\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_vector_create\fR\*(T>() allocates and initialises a new statgrab vector with \*(T elements ready for use. Space for \*(T elements is initially allocated (to avoid too many calls to \*(T<\fBrealloc\fR\*(T>() during later \*(T<\fBsg_vector_resize\fR\*(T>() calls). The value of \*(T must be a power of 2, it's rounded up to the next power of 2 when it's not. If \*(T is not a multiple of \*(T, it's rounded up to the next multiple of \*(T. It returns a pointer to the newly created vector. .PP \*(T<\fBsg_vector_clear\fR\*(T>() destroys all elements contained in the given vector. In opposite to \*(T<\fBsg_vector_resize\fR\*(T>( x, 0 ) the allocated size of the vector remains untouched. .PP \*(T<\fBsg_vector_resize\fR\*(T>() increases or decreases the amount of allocated elements in the specified vector. The amount of allocated elements is always a multiple of the intialisation parameter \*(T. In the special case, \*(T<\fBsg_vector_resize\fR\*(T>() is called with 0 in argument \*(T, the vector is freed after all vector elements had been destroyed. It returns the pointer to the resized vector. .PP \*(T<\fBsg_vector_free\fR\*(T>() destroys all vector elements and deallocates the storage belonging to the given vector. .PP \*(T<\fBsg_vector_clone\fR\*(T>() clones all elements of the given vector into a new vector created with the same specification as the referenced one. It returns a pointer to the cloned vector. .PP \*(T<\fBsg_vector_clone_into\fR\*(T>() clones all elements of the given source vector into the given target vector. The target vector must be created for the same element data type as the source vector. It returns an error code != to SG_ERROR_NONE if something went wrong. .PP \*(T<\fBsg_vector_compute_diff\fR\*(T>() computes a difference vector between the vector containing current statistics and another vector containing older statistics. If an element exists in the current vector but not in the opposite one, it's cloned into the result vector. If an element exists only in the opposite vector, it doesn't appear in the target vector. \*(T<\fBsg_vector_compute_diff\fR\*(T>() returns an error code != to SG_ERROR_NONE if something went wrong. .PP \*(T<\fBsg_prove_vector\fR\*(T>() proves whether a pointer to a vector really points to a vector. In case the given vector pointer points to corrupted data, the program is aborted. When \*(T<\fBsg_prove_vector\fR\*(T>() returns, it returns SG_ERROR_NONE. .PP \*(T<\fBsg_get_nelements\fR\*(T>() returns the number of elements the given data area, encompasses by a statgrab vector, contains. The vector head is internally calculated from the given pointer to the first vector element. .PP \*(T<\fBsg_free_stats_buf\fR\*(T>() frees the vector emcompassing the given data area. .SH NOTES Except \*(T<\fBsg_get_nelements\fR\*(T>() and \*(T<\fBsg_free_stats_buf\fR\*(T>() none of above functions can be called from outside of the libstatgrab sources. The documented structures and APIs may change without warning. The description of all other API is intended to be read from libstatgrab developers only. .PP Each vector is created from two elements: the vector information and the list of elements: .nf \*(T< template struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; Impl vector_implementation; T elements[alloc_count]; }; \*(T> .fi Of course, it is not valid C, so being tricky was the solution: .nf \*(T< typedef struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; struct sg_vector_init_info info; } sg_vector; struct sg_vector_size_helper { struct sg_vector v; long long ll; }; #define VECTOR_SIZE offsetof(struct sg_vector_size_helper,ll) /* Return the data ptr of a vector */ #define VECTOR_DATA(vector) \e (vector ? (void *)(((char *)vector)+VECTOR_SIZE) : NULL) #define VECTOR_ADDR_ARITH(ptr) \e (sg_vector *)(((char *)(ptr))\-VECTOR_SIZE) /* Return the vector for a data */ #define VECTOR_ADDRESS(ptr) \e ((ptr) ? (SG_ERROR_NONE == sg_prove_vector(VECTOR_ADDR_ARITH(ptr)) ? VECTOR_ADDR_ARITH(ptr) : NULL ) : NULL) \*(T> .fi .PP This also allows user functions as \*(T<\fBsg_get_nelements\fR\*(T>() and \*(T<\fBsg_free_stats_buf\fR\*(T>() to switch easily between the vector structure and the content. .SS "THE VECTOR SPECIALISATION STRUCTURE" As mentioned, the vector implementation uses strategies from the object oriented programming concept named "polymorphism". A vector is described by a small object containing inherent attributes like element size and a bunch of "virtual methods" to do element related tasks like initialising or destroying elements. .PP .nf \*(T< typedef void (*vector_init_function)(void *item); typedef sg_error (*vector_copy_function)(const void *src, void *dst); typedef sg_error (*vector_compute_diff_function)(void *dst, const void *src); typedef int (*vector_compare_function)(const void *a, const void *b); typedef void (*vector_destroy_function)(void *item); struct sg_vector_init_info { size_t item_size; vector_init_function init_fn; vector_copy_function copy_fn; vector_compute_diff_function compute_diff_fn; vector_compare_function compare_fn; vector_destroy_function destroy_fn; }; \*(T> .fi .PP The instances of struct \*(T are conceptional statically initialised by using either the preprocessor macro \*(T<\fBVECTOR_INIT_INFO_FULL_INIT\fR\*(T>(\*(T) or \*(T<\fBVECTOR_INIT_INFO_EMPTY_INIT\fR\*(T>(\*(T). Here're some examples to demonstrate how it's meant: \fBInitialising CPU statistics vector description\fR .PP .nf \*(T< VECTOR_INIT_INFO_EMPTY_INIT(sg_cpu_stats); \*(T> .fi .PP \fBInitialising Host-Info statistics vector description\fR .PP .nf \*(T< static void sg_os_stats_item_init(sg_os_stats *d); static void sg_os_stats_item_destroy(sg_os_stats *d); #define sg_os_stats_item_copy NULL #define sg_os_stats_item_compute_diff NULL #define sg_os_stats_item_compare NULL VECTOR_INIT_INFO_FULL_INIT(sg_os_stats); \*(T> .fi .PP \fBInitialising Disk-IO statistics vector description\fR .PP .nf \*(T< static void sg_disk_io_stats_item_init(sg_disk_io_stats *d); static sg_error sg_disk_io_stats_item_copy(sg_disk_io_stats *d, const sg_disk_io_stats *s); static sg_error sg_disk_io_stats_item_compute_diff(const sg_disk_io_stats *s, sg_disk_io_stats *d); static int sg_disk_io_stats_item_compare(const sg_disk_io_stats *a, const sg_disk_io_stats *b); static void sg_disk_io_stats_item_destroy(sg_disk_io_stats *d); VECTOR_INIT_INFO_FULL_INIT(sg_disk_io_stats); \*(T> .fi .SS "WORKING WITH VECTORS" To simplify the working with the vector management functions, some preprocessor macros are available. They are shown here as if they were functions to ease understanding. .PP 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fItype\fR, size_t \fIblock_size\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR, size_t \fInew_count\fR, identifier \fItype\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIvectorptr\fR, size_t \fInew_count\fR, datatype *\fIdata\fR, identifier \fIdatatype\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .PP \*(T<\fBVECTOR_CREATE\fR\*(T>() calls \*(T<\fBsg_vector_create\fR\*(T>() with \*(T and \*(T using the vector specialisation \*(T. .PP \*(T<\fBVECTOR_CLEAR\fR\*(T>() simply calls \*(T<\fBsg_vector_clear\fR\*(T>(). This macro exists only for conformity. .PP \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() calls \*(T<\fBsg_vector_create\fR\*(T>() when the given vector pointer points to \*(T or \*(T<\fBsg_vector_resize\fR\*(T>() otherwise. The result of the appropriate function is returned. .PP \*(T<\fBVECTOR_UPDATE\fR\*(T>() calls \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() and sets data to the first element of the resulting vector when a non-NULL pointer got, to NULL otherwise. When \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() returns a NULL pointer and \*(T is not equal to 0 (zero), the intructions from the macro \*(T<\fBVECTOR_UPDATE_ERROR_CLEANUP\fR\*(T> are executed to cleanup before returning from current subroutine with the error which has been occurred. .PP \*(T<\fBVECTOR_ITEM_COUNT\fR\*(T>() returns 0 for a non-existing vector (\*(T == 0) and the number of containing elements otherwise. .SH "RETURN VALUES" Beside error codes, the return values, if any, are always a pointer to vector structures (struct \*(T *). .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_process_compare_pid.3000644 001750 001750 00000026125 12200045617 023742 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_process_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_process_stats, sg_get_process_stats_r, sg_get_process_count, sg_get_process_count_of, sg_get_process_count_r, sg_free_process_count, sg_process_compare_name, sg_process_compare_pid, sg_process_compare_uid, sg_process_compare_gid, sg_process_compare_size, sg_process_compare_res, sg_process_compare_cpu, sg_process_compare_time \- get process statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count_source \fIpcs\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats const *\fIwhereof\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_process_stats\fR\*(T> functions provide statistics about the currently running processes. Both functions, \*(T<\fBsg_get_process_stats\fR\*(T>() and \*(T<\fBsg_get_process_stats_r\fR\*(T>(), take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The functions \*(T<\fBsg_get_process_count_of\fR\*(T>() and \*(T<\fBsg_get_process_count_r\fR\*(T>() provide an aggregated view of the process table - they deliver the amount of processes per process state. The \*(T<\fBsg_get_process_count\fR\*(T>() is in fact a preprocessor macro for backward compatibility and calls \*(T<\fBsg_get_process_count_of\fR\*(T>() with the parameter \*(T of sg_entire_process_count to emulate the behavior until 0.17. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_process_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_process_count_of T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_count_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_process_stats_r\fR\*(T>() or the \*(T summaries received from \*(T<\fBsg_get_process_count_r\fR\*(T> must be freed using \*(T<\fBsg_free_process_stats\fR\*(T>() or \*(T<\fBsg_free_process_count\fR\*(T>(), respectively. The caller is responsible for doing it when the data isn't needed any more. .PP \*(T<\fBsg_process_compare_name\fR\*(T> .br \*(T<\fBsg_process_compare_pid\fR\*(T> .br \*(T<\fBsg_process_compare_uid\fR\*(T> .br \*(T<\fBsg_process_compare_gid\fR\*(T> .br \*(T<\fBsg_process_compare_size\fR\*(T> .br \*(T<\fBsg_process_compare_res\fR\*(T> .br \*(T<\fBsg_process_compare_cpu\fR\*(T> .br \*(T<\fBsg_process_compare_time\fR\*(T> .PP These functions compare two sg_process_stats entries, and return an int to represent which one is greater. The main use of these functions is to be passed to qsort to sort the sg_process_stats by the given type. \fBExample\fR .PP .nf \*(T< size_t entries; sg_process_stats *proc_stats = NULL; while( NULL != ( proc_stats = sg_get_process_stats_r(&entries) ) ) { /* order entries by comparing the process identifier */ qsort( proc_stats, entries, sizeof(proc_stats[0]), &sg_process_compare_pid ); show_proc_stats( proc_stats ); sg_free_process_stats( proc_stats ); } \*(T> .fi .SH "RETURN VALUES" The structure returned by sg_get_process_stats is of type \*(T. .PP .nf \*(T< typedef struct { char *process_name; char *proctitle; pid_t pid; /* process identifier */ pid_t parent; /* Parent pid */ pid_t pgid; /* process id of process group leader */ pid_t sessid; /* session id of the session the process belongs to */ uid_t uid; uid_t euid; gid_t gid; gid_t egid; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long proc_size; /* in bytes */ unsigned long long proc_resident; /* in bytes */ time_t start_time; /* When was the process started */ time_t time_spent; /* time running in seconds */ double cpu_percent; int nice; sg_process_state state; time_t systime; } sg_process_stats; \*(T> .fi .PP .nf \*(T< typedef enum { SG_PROCESS_STATE_RUNNING, SG_PROCESS_STATE_SLEEPING, SG_PROCESS_STATE_STOPPED, SG_PROCESS_STATE_ZOMBIE, SG_PROCESS_STATE_UNKNOWN } sg_process_state; \*(T> .fi .TP \*(T The name of the command that was run. The content of this field heavily depends on the underlying operating system, some store the basename the executable passes to the \*(T<\fBexec\fR\*(T>(2) system call, some the entire path. Most OS restrict the size of this field - some like the *BSD family to a very low value of 15 bytes. This field is usually immutable for userland processes. .TP \*(T The command line (the "title") of the process. Take note - this can be modified by the process, so isn't guaranteed to be the original command line. .TP \*(T The process ID. .TP \*(T The parent process ID. .TP \*(T The process ID of the process group leader. .TP \*(T Session id of the session the process belongs to. .TP \*(T The ID of the user the process is running as. .TP \*(T The ID of the effective user the process is running as. .TP \*(T The ID of the group the process is running as. .TP \*(T The ID of the effective group the process is running as. .TP \*(T The number of context switches of this process (voluntary and involuntary). .TP \*(T The number of voluntary context switches of this process (eg. by calling \*(T<\fBsched_yield\fR\*(T>() or \*(T<\fBsleep\fR\*(T>()). .TP \*(T The number of involuntary context switches of this process (eg. time slice exhausted or signal sent). .TP \*(T The virtual memory size of the process in bytes. .TP \*(T The size of the process that's resident in memory. .TP \*(T The time when the process has been started in seconds since epoch. .TP \*(T The number of seconds the process has been running (user+system time, without time spent by child processes). .TP \*(T The current percentage of CPU the process is using. .TP \*(T The nice value of the process. .TP \*(T The current state of the process. See sg_process_state for permitted values. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. This might be (but doesn't have to be) the same moment for all returned entries, regardless whether they're fetched with one snapshot or puzzled from some kind of procfs. .PP The structure returned by sg_get_process_count_of and sg_get_process_count_r is of type \*(T. .PP .nf \*(T< typedef enum sg_process_count_source { sg_entire_process_count, sg_last_process_count } sg_process_count_source; \*(T> .fi .PP .nf \*(T< typedef struct{ unsigned long long total; unsigned long long running; unsigned long long sleeping; unsigned long long stopped; unsigned long long zombie; unsigned long long unknown; time_t systime; }sg_process_count; \*(T> .fi .TP \*(T The total number of processes. .TP \*(T The number of running processes. .TP \*(T The number of sleeping processes. .TP \*(T The number of stopped processes. .TP \*(T The number of zombie processes. .TP \*(T The number of processes not matching any of above named categories. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. .SH BUGS The very first call of \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_last_process_count) will return the same as \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_entire_process_count). .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_process_compare_time.3000644 001750 001750 00000026125 12200045617 024124 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_process_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_process_stats, sg_get_process_stats_r, sg_get_process_count, sg_get_process_count_of, sg_get_process_count_r, sg_free_process_count, sg_process_compare_name, sg_process_compare_pid, sg_process_compare_uid, sg_process_compare_gid, sg_process_compare_size, sg_process_compare_res, sg_process_compare_cpu, sg_process_compare_time \- get process statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count_source \fIpcs\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats const *\fIwhereof\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_process_stats\fR\*(T> functions provide statistics about the currently running processes. Both functions, \*(T<\fBsg_get_process_stats\fR\*(T>() and \*(T<\fBsg_get_process_stats_r\fR\*(T>(), take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The functions \*(T<\fBsg_get_process_count_of\fR\*(T>() and \*(T<\fBsg_get_process_count_r\fR\*(T>() provide an aggregated view of the process table - they deliver the amount of processes per process state. The \*(T<\fBsg_get_process_count\fR\*(T>() is in fact a preprocessor macro for backward compatibility and calls \*(T<\fBsg_get_process_count_of\fR\*(T>() with the parameter \*(T of sg_entire_process_count to emulate the behavior until 0.17. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_process_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_process_count_of T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_count_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_process_stats_r\fR\*(T>() or the \*(T summaries received from \*(T<\fBsg_get_process_count_r\fR\*(T> must be freed using \*(T<\fBsg_free_process_stats\fR\*(T>() or \*(T<\fBsg_free_process_count\fR\*(T>(), respectively. The caller is responsible for doing it when the data isn't needed any more. .PP \*(T<\fBsg_process_compare_name\fR\*(T> .br \*(T<\fBsg_process_compare_pid\fR\*(T> .br \*(T<\fBsg_process_compare_uid\fR\*(T> .br \*(T<\fBsg_process_compare_gid\fR\*(T> .br \*(T<\fBsg_process_compare_size\fR\*(T> .br \*(T<\fBsg_process_compare_res\fR\*(T> .br \*(T<\fBsg_process_compare_cpu\fR\*(T> .br \*(T<\fBsg_process_compare_time\fR\*(T> .PP These functions compare two sg_process_stats entries, and return an int to represent which one is greater. The main use of these functions is to be passed to qsort to sort the sg_process_stats by the given type. \fBExample\fR .PP .nf \*(T< size_t entries; sg_process_stats *proc_stats = NULL; while( NULL != ( proc_stats = sg_get_process_stats_r(&entries) ) ) { /* order entries by comparing the process identifier */ qsort( proc_stats, entries, sizeof(proc_stats[0]), &sg_process_compare_pid ); show_proc_stats( proc_stats ); sg_free_process_stats( proc_stats ); } \*(T> .fi .SH "RETURN VALUES" The structure returned by sg_get_process_stats is of type \*(T. .PP .nf \*(T< typedef struct { char *process_name; char *proctitle; pid_t pid; /* process identifier */ pid_t parent; /* Parent pid */ pid_t pgid; /* process id of process group leader */ pid_t sessid; /* session id of the session the process belongs to */ uid_t uid; uid_t euid; gid_t gid; gid_t egid; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long proc_size; /* in bytes */ unsigned long long proc_resident; /* in bytes */ time_t start_time; /* When was the process started */ time_t time_spent; /* time running in seconds */ double cpu_percent; int nice; sg_process_state state; time_t systime; } sg_process_stats; \*(T> .fi .PP .nf \*(T< typedef enum { SG_PROCESS_STATE_RUNNING, SG_PROCESS_STATE_SLEEPING, SG_PROCESS_STATE_STOPPED, SG_PROCESS_STATE_ZOMBIE, SG_PROCESS_STATE_UNKNOWN } sg_process_state; \*(T> .fi .TP \*(T The name of the command that was run. The content of this field heavily depends on the underlying operating system, some store the basename the executable passes to the \*(T<\fBexec\fR\*(T>(2) system call, some the entire path. Most OS restrict the size of this field - some like the *BSD family to a very low value of 15 bytes. This field is usually immutable for userland processes. .TP \*(T The command line (the "title") of the process. Take note - this can be modified by the process, so isn't guaranteed to be the original command line. .TP \*(T The process ID. .TP \*(T The parent process ID. .TP \*(T The process ID of the process group leader. .TP \*(T Session id of the session the process belongs to. .TP \*(T The ID of the user the process is running as. .TP \*(T The ID of the effective user the process is running as. .TP \*(T The ID of the group the process is running as. .TP \*(T The ID of the effective group the process is running as. .TP \*(T The number of context switches of this process (voluntary and involuntary). .TP \*(T The number of voluntary context switches of this process (eg. by calling \*(T<\fBsched_yield\fR\*(T>() or \*(T<\fBsleep\fR\*(T>()). .TP \*(T The number of involuntary context switches of this process (eg. time slice exhausted or signal sent). .TP \*(T The virtual memory size of the process in bytes. .TP \*(T The size of the process that's resident in memory. .TP \*(T The time when the process has been started in seconds since epoch. .TP \*(T The number of seconds the process has been running (user+system time, without time spent by child processes). .TP \*(T The current percentage of CPU the process is using. .TP \*(T The nice value of the process. .TP \*(T The current state of the process. See sg_process_state for permitted values. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. This might be (but doesn't have to be) the same moment for all returned entries, regardless whether they're fetched with one snapshot or puzzled from some kind of procfs. .PP The structure returned by sg_get_process_count_of and sg_get_process_count_r is of type \*(T. .PP .nf \*(T< typedef enum sg_process_count_source { sg_entire_process_count, sg_last_process_count } sg_process_count_source; \*(T> .fi .PP .nf \*(T< typedef struct{ unsigned long long total; unsigned long long running; unsigned long long sleeping; unsigned long long stopped; unsigned long long zombie; unsigned long long unknown; time_t systime; }sg_process_count; \*(T> .fi .TP \*(T The total number of processes. .TP \*(T The number of running processes. .TP \*(T The number of sleeping processes. .TP \*(T The number of stopped processes. .TP \*(T The number of zombie processes. .TP \*(T The number of processes not matching any of above named categories. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. .SH BUGS The very first call of \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_last_process_count) will return the same as \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_entire_process_count). .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_disk_io_stats_diff.3000644 001750 001750 00000014326 12200045616 024407 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_disk_io_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_disk_io_stats, sg_get_disk_io_stats_r, sg_get_disk_io_stats_diff, sg_get_disk_io_stats_diff_between, sg_free_disk_io_stats, sg_disk_io_compare_name, sg_disk_io_compare_traffic \- get disk io statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_disk_io_stats *\fIcur\fR, const sg_disk_io_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_disk_io_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_disk_io_stats\fR\*(T> functions provide disk I/O statistics on a per disk basis. All get- and diff-functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The \*(T<\fBsg_get_disk_io_stats\fR\*(T>() and \*(T<\fBsg_get_disk_io_stats_r\fR\*(T>() functions deliver the I/O-statistics since the disk has been attached to the system. The \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T>() and \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T>() deliver the difference between two calls of \*(T<\fBsg_get_disk_io_stats\fR\*(T>() or \*(T<\fBsg_get_disk_io_stats_r\fR\*(T>(), respectively. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_disk_io_stats T} T{ sg_disk_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_disk_io_stats_r T} T{ sg_disk_io_stats * T} T{ caller T} T{ sg_get_disk_io_stats_diff T} T{ sg_disk_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_disk_io_stats_diff_between T} T{ sg_disk_io_stats * T} T{ caller T} .TE .PP \*(T vectors got from \*(T<\fBsg_get_disk_io_stats_r\fR\*(T>() or \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_disk_io_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .PP Additionally two support functions for \*(T<\fBqsort\fR\*(T>(3) are available: \*(T<\fBsg_disk_io_compare_name\fR\*(T>() and \*(T<\fBsg_disk_io_compare_traffic\fR\*(T>(). \fBExample\fR .PP .nf \*(T< size_t entries; sg_disk_io_stats *io_stats = NULL; while( NULL != ( io_stats = sg_get_disk_io_stats_diff(&entries) ) ) { /* show disks with most traffic first */ qsort( io_stats, entries, sizeof(io_stats[0]), &sg_disk_io_compare_traffic ); show_disk_io_stats( io_stats ); } \*(T> .fi .PP On some platforms, such as Solaris 7, the kernel value is stored in a 32bit int, so wraps around when it reaches 4GB. Other platforms, such as Solaris 8 (and most other modern systems), hold the value in a 64bit int, which wraps somewhere near 17 million terabytes. The \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T>() function and the \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T>() function care about these overflows and try to detect overflows when the diff is calculated. .PP On Solaris libstatgrab will attempt to get the cXtXdXsX representation for the \*(T string. If it fails it will use a name like sd0. On some systems programs calling libstatgrab will need elevated privileges to lookup some of the names. The mappings are built up when \*(T<\fBsg_init\fR\*(T>() is called for the first time. .SH "RETURN VALUES" All diskio statistics return a pointer to a structure of type \*(T. .PP .nf \*(T< typedef struct { char *disk_name; unsigned long long read_bytes; unsigned long long write_bytes; time_t systime; } sg_disk_io_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be hda) .TP \*(T The number of bytes the disk has read. .TP \*(T The number of bytes the disk has written. .TP \*(T The time period over which \*(T and \*(T were transferred. .SH BUGS \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T> and \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T> compare two lists of disk (block device) related I/O statistics. Each entry occurring only in the second list is passed through to the resulting list as if it would have been compared to an entry with all statistic values set to 0. This implies, on the very first call \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T> will return the same as \*(T<\fBsg_get_disk_io_stats\fR\*(T>. .PP On operating systems that hold only 32bits of data there is a problem if the values wrap twice. For example, on Solaris 7 if 9GB is transferred and the operating system wraps at 4GB, the \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T>() function will return 5GB. .PP The compare functions exists rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_cpu_percents_r.3000644 001750 001750 00000013052 12200045616 023566 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_cpu_stats 3 2013-06-17 i-scream "" .SH NAME sg_get_cpu_stats, sg_get_cpu_stats_r, sg_get_cpu_stats_diff, sg_get_cpu_stats_diff_between, sg_get_cpu_percents, sg_get_cpu_percents_of, sg_get_cpu_percents_r, sg_free_cpu_stats \- get cpu usage .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_percent_source \fIcps\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_cpu_stats *\fIwhereof\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_percents *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_cpu_stats *\fIcpu_now\fR, const sg_cpu_stats *\fIcpu_last\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION These are the categories of data delivered by the cpu stats module: \*(T<\fBsg_get_cpu_stats\fR\*(T>() and \*(T<\fBsg_get_cpu_stats_r\fR\*(T>() deliver native cpu counters since the machine has been started, \*(T<\fBsg_get_cpu_stats_diff\fR\*(T>() and \*(T<\fBsg_get_cpu_stats_diff_between\fR\*(T>() deliver native cpu counters between two \*(T<\fBsg_get_cpu_stats\fR\*(T>() calls and \*(T<\fBsg_get_cpu_percents_of\fR\*(T>() and \*(T<\fBsg_get_cpu_percents_r\fR\*(T>() deliver correlated relative cpu counters (where total is 100%). .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_cpu_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_cpu_stats_diff T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_stats_diff_between T} T{ \*(T * T} T{ caller T} T{ sg_get_cpu_percents_of T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_percents_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_cpu_stats_r\fR\*(T>() and the \*(T<\fBsg_get_cpu_stats_diff_between\fR\*(T>() as well as the \*(T buffer received from \*(T<\fBsg_get_cpu_percents_r\fR\*(T>() must be freed using \*(T<\fBsg_free_cpu_stats\fR\*(T>() or the \*(T<\fBsg_free_cpu_percents\fR\*(T>(), respectively, when not needed any more. The caller is responsible for doing it. .PP The value stored (the "ticks") will vary between operating systems. For example Solaris has a total of 100 per second, while Linux has substantially more. Also, different operating systems store different information - you won't find nice cpu on Solaris for example. .PP Modern systems shall provide information about the clock tick resolution by invoking \*(T. .SH "RETURN VALUES" There are two structures returned by the CPU statistics functions. .PP .nf \*(T< typedef struct { unsigned long long user; unsigned long long kernel; unsigned long long idle; unsigned long long iowait; unsigned long long swap; unsigned long long nice; unsigned long long total; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long syscalls; unsigned long long interrupts; unsigned long long soft_interrupts; time_t systime; } sg_cpu_stats; \*(T> .fi .PP .nf \*(T< typedef struct { double user; double kernel; double idle; double iowait; double swap; double nice; time_t time_taken; } sg_cpu_percents; \*(T> .fi .TP \*(T \*(T \*(T \*(T \*(T \*(T \*(T The different CPU states. .TP \*(T \*(T \*(T \*(T \*(T \*(T The different program actions on CPU. .TP \*(T \*(T The time taken in seconds since the last call of the function, or the system time. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_swap_stats_r.3000644 001750 001750 00000010454 12200045616 023267 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_mem_stats 3 2013-06-17 i-scream "" .SH NAME sg_get_mem_stats, sg_get_mem_stats_r, sg_free_mem_stats, sg_get_swap_stats, sg_get_swap_stats_r, sg_free_swap_stats \- get VM statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_mem_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_swap_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION Memory statistics are accessed through the \*(T<\fBsg_get_mem_stats\fR\*(T>() function and the \*(T<\fBsg_get_mem_stats_r\fR\*(T>() function. Both return a pointer to a \*(T buffer. Note that this statistic doesn't need to map the entire physical memory usage, it represents the real memory usable by the operating system. .PP Memory statistics are accessed through the \*(T<\fBsg_get_swap_stats\fR\*(T>() function and the \*(T<\fBsg_get_swap_stats_r\fR\*(T>() function. Both return a pointer to a \*(T buffer. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_mem_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_mem_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_swap_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_swap_stats_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_mem_stats_r\fR\*(T>() and the \*(T buffer received from \*(T<\fBsg_get_swap_stats_r\fR\*(T>() must be freed using \*(T<\fBsg_free_mem_stats\fR\*(T>() or the \*(T<\fBsg_free_swap_stats\fR\*(T>(), respectively, when not needed any more. The caller is responsible for doing it. .PP On the FreeBSD operating system elevated privileges are required to access the swap statistics. Making the program setgid kmem should be sufficient. Programs running as root will not have this problem. .SH "RETURN VALUES" The VM system calls can return a pointer to either a \*(T or a \*(T. .PP .nf \*(T< typedef struct{ unsigned long long total; unsigned long long free; unsigned long long used; unsigned long long cache; time_t systime; } sg_mem_stats; \*(T> .fi .TP \*(T The total amount of real memory in bytes. .TP \*(T The free amount of real memory in bytes. .TP \*(T The used amount of real memory in bytes. .TP \*(T The amount of real memory in bytes used for caching. .TP \*(T the timestamp when the above stats where collected in seconds since epoch .PP .nf \*(T< typedef struct { unsigned long long total; unsigned long long used; unsigned long long free; time_t systime; } sg_swap_stats; \*(T> .fi .TP \*(T The total swap space in bytes. .TP \*(T The used swap in bytes. .TP \*(T The free swap in bytes. .TP \*(T The timestamp when the above stats where collected in seconds since epoch .SH TODO Add a function to hold open the file descriptor to the kernel memory structures. Doing this would allow the elevated privileges to be dropped early on. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_mem_stats.3000644 001750 001750 00000010454 12200045616 022552 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_mem_stats 3 2013-06-17 i-scream "" .SH NAME sg_get_mem_stats, sg_get_mem_stats_r, sg_free_mem_stats, sg_get_swap_stats, sg_get_swap_stats_r, sg_free_swap_stats \- get VM statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_mem_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_swap_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION Memory statistics are accessed through the \*(T<\fBsg_get_mem_stats\fR\*(T>() function and the \*(T<\fBsg_get_mem_stats_r\fR\*(T>() function. Both return a pointer to a \*(T buffer. Note that this statistic doesn't need to map the entire physical memory usage, it represents the real memory usable by the operating system. .PP Memory statistics are accessed through the \*(T<\fBsg_get_swap_stats\fR\*(T>() function and the \*(T<\fBsg_get_swap_stats_r\fR\*(T>() function. Both return a pointer to a \*(T buffer. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_mem_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_mem_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_swap_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_swap_stats_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_mem_stats_r\fR\*(T>() and the \*(T buffer received from \*(T<\fBsg_get_swap_stats_r\fR\*(T>() must be freed using \*(T<\fBsg_free_mem_stats\fR\*(T>() or the \*(T<\fBsg_free_swap_stats\fR\*(T>(), respectively, when not needed any more. The caller is responsible for doing it. .PP On the FreeBSD operating system elevated privileges are required to access the swap statistics. Making the program setgid kmem should be sufficient. Programs running as root will not have this problem. .SH "RETURN VALUES" The VM system calls can return a pointer to either a \*(T or a \*(T. .PP .nf \*(T< typedef struct{ unsigned long long total; unsigned long long free; unsigned long long used; unsigned long long cache; time_t systime; } sg_mem_stats; \*(T> .fi .TP \*(T The total amount of real memory in bytes. .TP \*(T The free amount of real memory in bytes. .TP \*(T The used amount of real memory in bytes. .TP \*(T The amount of real memory in bytes used for caching. .TP \*(T the timestamp when the above stats where collected in seconds since epoch .PP .nf \*(T< typedef struct { unsigned long long total; unsigned long long used; unsigned long long free; time_t systime; } sg_swap_stats; \*(T> .fi .TP \*(T The total swap space in bytes. .TP \*(T The used swap in bytes. .TP \*(T The free swap in bytes. .TP \*(T The timestamp when the above stats where collected in seconds since epoch .SH TODO Add a function to hold open the file descriptor to the kernel memory structures. Doing this would allow the elevated privileges to be dropped early on. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_vector_compute_diff.3000644 001750 001750 00000027361 12200045617 023753 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_vector_create 3 2013-06-07 i-scream "" .SH NAME sg_vector_create, sg_vector_clear, sg_vector_resize, sg_vector_free, sg_vector_clone, sg_vector_clone_into, sg_vector_compute_diff, sg_prove_vector, sg_get_nelements, sg_free_stats_buf \- statgrab vector management .SH SYNOPSIS 'nh .nf \*(T<#include "statgrab.h" #include "vector.h"\*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t \fIblock_size\fR, size_t \fIalloc_count\fR, size_t \fIinitial_used\fR, const sg_vector_init_info * const \fIinfo\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const struct sg_vector *\fIsrc\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIdest\fR, const struct sg_vector *\fIsrc\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIdest\fR, const struct sg_vector *\fIcur_vector\fR, const struct sg_vector *\fIlast_vector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const struct sg_vector *\fIvec\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_vector_create\fR\*(T>() allocates and initialises a new statgrab vector with \*(T elements ready for use. Space for \*(T elements is initially allocated (to avoid too many calls to \*(T<\fBrealloc\fR\*(T>() during later \*(T<\fBsg_vector_resize\fR\*(T>() calls). The value of \*(T must be a power of 2, it's rounded up to the next power of 2 when it's not. If \*(T is not a multiple of \*(T, it's rounded up to the next multiple of \*(T. It returns a pointer to the newly created vector. .PP \*(T<\fBsg_vector_clear\fR\*(T>() destroys all elements contained in the given vector. In opposite to \*(T<\fBsg_vector_resize\fR\*(T>( x, 0 ) the allocated size of the vector remains untouched. .PP \*(T<\fBsg_vector_resize\fR\*(T>() increases or decreases the amount of allocated elements in the specified vector. The amount of allocated elements is always a multiple of the intialisation parameter \*(T. In the special case, \*(T<\fBsg_vector_resize\fR\*(T>() is called with 0 in argument \*(T, the vector is freed after all vector elements had been destroyed. It returns the pointer to the resized vector. .PP \*(T<\fBsg_vector_free\fR\*(T>() destroys all vector elements and deallocates the storage belonging to the given vector. .PP \*(T<\fBsg_vector_clone\fR\*(T>() clones all elements of the given vector into a new vector created with the same specification as the referenced one. It returns a pointer to the cloned vector. .PP \*(T<\fBsg_vector_clone_into\fR\*(T>() clones all elements of the given source vector into the given target vector. The target vector must be created for the same element data type as the source vector. It returns an error code != to SG_ERROR_NONE if something went wrong. .PP \*(T<\fBsg_vector_compute_diff\fR\*(T>() computes a difference vector between the vector containing current statistics and another vector containing older statistics. If an element exists in the current vector but not in the opposite one, it's cloned into the result vector. If an element exists only in the opposite vector, it doesn't appear in the target vector. \*(T<\fBsg_vector_compute_diff\fR\*(T>() returns an error code != to SG_ERROR_NONE if something went wrong. .PP \*(T<\fBsg_prove_vector\fR\*(T>() proves whether a pointer to a vector really points to a vector. In case the given vector pointer points to corrupted data, the program is aborted. When \*(T<\fBsg_prove_vector\fR\*(T>() returns, it returns SG_ERROR_NONE. .PP \*(T<\fBsg_get_nelements\fR\*(T>() returns the number of elements the given data area, encompasses by a statgrab vector, contains. The vector head is internally calculated from the given pointer to the first vector element. .PP \*(T<\fBsg_free_stats_buf\fR\*(T>() frees the vector emcompassing the given data area. .SH NOTES Except \*(T<\fBsg_get_nelements\fR\*(T>() and \*(T<\fBsg_free_stats_buf\fR\*(T>() none of above functions can be called from outside of the libstatgrab sources. The documented structures and APIs may change without warning. The description of all other API is intended to be read from libstatgrab developers only. .PP Each vector is created from two elements: the vector information and the list of elements: .nf \*(T< template struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; Impl vector_implementation; T elements[alloc_count]; }; \*(T> .fi Of course, it is not valid C, so being tricky was the solution: .nf \*(T< typedef struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; struct sg_vector_init_info info; } sg_vector; struct sg_vector_size_helper { struct sg_vector v; long long ll; }; #define VECTOR_SIZE offsetof(struct sg_vector_size_helper,ll) /* Return the data ptr of a vector */ #define VECTOR_DATA(vector) \e (vector ? (void *)(((char *)vector)+VECTOR_SIZE) : NULL) #define VECTOR_ADDR_ARITH(ptr) \e (sg_vector *)(((char *)(ptr))\-VECTOR_SIZE) /* Return the vector for a data */ #define VECTOR_ADDRESS(ptr) \e ((ptr) ? (SG_ERROR_NONE == sg_prove_vector(VECTOR_ADDR_ARITH(ptr)) ? VECTOR_ADDR_ARITH(ptr) : NULL ) : NULL) \*(T> .fi .PP This also allows user functions as \*(T<\fBsg_get_nelements\fR\*(T>() and \*(T<\fBsg_free_stats_buf\fR\*(T>() to switch easily between the vector structure and the content. .SS "THE VECTOR SPECIALISATION STRUCTURE" As mentioned, the vector implementation uses strategies from the object oriented programming concept named "polymorphism". A vector is described by a small object containing inherent attributes like element size and a bunch of "virtual methods" to do element related tasks like initialising or destroying elements. .PP .nf \*(T< typedef void (*vector_init_function)(void *item); typedef sg_error (*vector_copy_function)(const void *src, void *dst); typedef sg_error (*vector_compute_diff_function)(void *dst, const void *src); typedef int (*vector_compare_function)(const void *a, const void *b); typedef void (*vector_destroy_function)(void *item); struct sg_vector_init_info { size_t item_size; vector_init_function init_fn; vector_copy_function copy_fn; vector_compute_diff_function compute_diff_fn; vector_compare_function compare_fn; vector_destroy_function destroy_fn; }; \*(T> .fi .PP The instances of struct \*(T are conceptional statically initialised by using either the preprocessor macro \*(T<\fBVECTOR_INIT_INFO_FULL_INIT\fR\*(T>(\*(T) or \*(T<\fBVECTOR_INIT_INFO_EMPTY_INIT\fR\*(T>(\*(T). Here're some examples to demonstrate how it's meant: \fBInitialising CPU statistics vector description\fR .PP .nf \*(T< VECTOR_INIT_INFO_EMPTY_INIT(sg_cpu_stats); \*(T> .fi .PP \fBInitialising Host-Info statistics vector description\fR .PP .nf \*(T< static void sg_os_stats_item_init(sg_os_stats *d); static void sg_os_stats_item_destroy(sg_os_stats *d); #define sg_os_stats_item_copy NULL #define sg_os_stats_item_compute_diff NULL #define sg_os_stats_item_compare NULL VECTOR_INIT_INFO_FULL_INIT(sg_os_stats); \*(T> .fi .PP \fBInitialising Disk-IO statistics vector description\fR .PP .nf \*(T< static void sg_disk_io_stats_item_init(sg_disk_io_stats *d); static sg_error sg_disk_io_stats_item_copy(sg_disk_io_stats *d, const sg_disk_io_stats *s); static sg_error sg_disk_io_stats_item_compute_diff(const sg_disk_io_stats *s, sg_disk_io_stats *d); static int sg_disk_io_stats_item_compare(const sg_disk_io_stats *a, const sg_disk_io_stats *b); static void sg_disk_io_stats_item_destroy(sg_disk_io_stats *d); VECTOR_INIT_INFO_FULL_INIT(sg_disk_io_stats); \*(T> .fi .SS "WORKING WITH VECTORS" To simplify the working with the vector management functions, some preprocessor macros are available. They are shown here as if they were functions to ease understanding. .PP 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fItype\fR, size_t \fIblock_size\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR, size_t \fInew_count\fR, identifier \fItype\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIvectorptr\fR, size_t \fInew_count\fR, datatype *\fIdata\fR, identifier \fIdatatype\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .PP \*(T<\fBVECTOR_CREATE\fR\*(T>() calls \*(T<\fBsg_vector_create\fR\*(T>() with \*(T and \*(T using the vector specialisation \*(T. .PP \*(T<\fBVECTOR_CLEAR\fR\*(T>() simply calls \*(T<\fBsg_vector_clear\fR\*(T>(). This macro exists only for conformity. .PP \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() calls \*(T<\fBsg_vector_create\fR\*(T>() when the given vector pointer points to \*(T or \*(T<\fBsg_vector_resize\fR\*(T>() otherwise. The result of the appropriate function is returned. .PP \*(T<\fBVECTOR_UPDATE\fR\*(T>() calls \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() and sets data to the first element of the resulting vector when a non-NULL pointer got, to NULL otherwise. When \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() returns a NULL pointer and \*(T is not equal to 0 (zero), the intructions from the macro \*(T<\fBVECTOR_UPDATE_ERROR_CLEANUP\fR\*(T> are executed to cleanup before returning from current subroutine with the error which has been occurred. .PP \*(T<\fBVECTOR_ITEM_COUNT\fR\*(T>() returns 0 for a non-existing vector (\*(T == 0) and the number of containing elements otherwise. .SH "RETURN VALUES" Beside error codes, the return values, if any, are always a pointer to vector structures (struct \*(T *). .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_process_compare_cpu.3000644 001750 001750 00000026125 12200045617 023755 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_process_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_process_stats, sg_get_process_stats_r, sg_get_process_count, sg_get_process_count_of, sg_get_process_count_r, sg_free_process_count, sg_process_compare_name, sg_process_compare_pid, sg_process_compare_uid, sg_process_compare_gid, sg_process_compare_size, sg_process_compare_res, sg_process_compare_cpu, sg_process_compare_time \- get process statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count_source \fIpcs\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats const *\fIwhereof\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_process_stats\fR\*(T> functions provide statistics about the currently running processes. Both functions, \*(T<\fBsg_get_process_stats\fR\*(T>() and \*(T<\fBsg_get_process_stats_r\fR\*(T>(), take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The functions \*(T<\fBsg_get_process_count_of\fR\*(T>() and \*(T<\fBsg_get_process_count_r\fR\*(T>() provide an aggregated view of the process table - they deliver the amount of processes per process state. The \*(T<\fBsg_get_process_count\fR\*(T>() is in fact a preprocessor macro for backward compatibility and calls \*(T<\fBsg_get_process_count_of\fR\*(T>() with the parameter \*(T of sg_entire_process_count to emulate the behavior until 0.17. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_process_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_process_count_of T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_count_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_process_stats_r\fR\*(T>() or the \*(T summaries received from \*(T<\fBsg_get_process_count_r\fR\*(T> must be freed using \*(T<\fBsg_free_process_stats\fR\*(T>() or \*(T<\fBsg_free_process_count\fR\*(T>(), respectively. The caller is responsible for doing it when the data isn't needed any more. .PP \*(T<\fBsg_process_compare_name\fR\*(T> .br \*(T<\fBsg_process_compare_pid\fR\*(T> .br \*(T<\fBsg_process_compare_uid\fR\*(T> .br \*(T<\fBsg_process_compare_gid\fR\*(T> .br \*(T<\fBsg_process_compare_size\fR\*(T> .br \*(T<\fBsg_process_compare_res\fR\*(T> .br \*(T<\fBsg_process_compare_cpu\fR\*(T> .br \*(T<\fBsg_process_compare_time\fR\*(T> .PP These functions compare two sg_process_stats entries, and return an int to represent which one is greater. The main use of these functions is to be passed to qsort to sort the sg_process_stats by the given type. \fBExample\fR .PP .nf \*(T< size_t entries; sg_process_stats *proc_stats = NULL; while( NULL != ( proc_stats = sg_get_process_stats_r(&entries) ) ) { /* order entries by comparing the process identifier */ qsort( proc_stats, entries, sizeof(proc_stats[0]), &sg_process_compare_pid ); show_proc_stats( proc_stats ); sg_free_process_stats( proc_stats ); } \*(T> .fi .SH "RETURN VALUES" The structure returned by sg_get_process_stats is of type \*(T. .PP .nf \*(T< typedef struct { char *process_name; char *proctitle; pid_t pid; /* process identifier */ pid_t parent; /* Parent pid */ pid_t pgid; /* process id of process group leader */ pid_t sessid; /* session id of the session the process belongs to */ uid_t uid; uid_t euid; gid_t gid; gid_t egid; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long proc_size; /* in bytes */ unsigned long long proc_resident; /* in bytes */ time_t start_time; /* When was the process started */ time_t time_spent; /* time running in seconds */ double cpu_percent; int nice; sg_process_state state; time_t systime; } sg_process_stats; \*(T> .fi .PP .nf \*(T< typedef enum { SG_PROCESS_STATE_RUNNING, SG_PROCESS_STATE_SLEEPING, SG_PROCESS_STATE_STOPPED, SG_PROCESS_STATE_ZOMBIE, SG_PROCESS_STATE_UNKNOWN } sg_process_state; \*(T> .fi .TP \*(T The name of the command that was run. The content of this field heavily depends on the underlying operating system, some store the basename the executable passes to the \*(T<\fBexec\fR\*(T>(2) system call, some the entire path. Most OS restrict the size of this field - some like the *BSD family to a very low value of 15 bytes. This field is usually immutable for userland processes. .TP \*(T The command line (the "title") of the process. Take note - this can be modified by the process, so isn't guaranteed to be the original command line. .TP \*(T The process ID. .TP \*(T The parent process ID. .TP \*(T The process ID of the process group leader. .TP \*(T Session id of the session the process belongs to. .TP \*(T The ID of the user the process is running as. .TP \*(T The ID of the effective user the process is running as. .TP \*(T The ID of the group the process is running as. .TP \*(T The ID of the effective group the process is running as. .TP \*(T The number of context switches of this process (voluntary and involuntary). .TP \*(T The number of voluntary context switches of this process (eg. by calling \*(T<\fBsched_yield\fR\*(T>() or \*(T<\fBsleep\fR\*(T>()). .TP \*(T The number of involuntary context switches of this process (eg. time slice exhausted or signal sent). .TP \*(T The virtual memory size of the process in bytes. .TP \*(T The size of the process that's resident in memory. .TP \*(T The time when the process has been started in seconds since epoch. .TP \*(T The number of seconds the process has been running (user+system time, without time spent by child processes). .TP \*(T The current percentage of CPU the process is using. .TP \*(T The nice value of the process. .TP \*(T The current state of the process. See sg_process_state for permitted values. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. This might be (but doesn't have to be) the same moment for all returned entries, regardless whether they're fetched with one snapshot or puzzled from some kind of procfs. .PP The structure returned by sg_get_process_count_of and sg_get_process_count_r is of type \*(T. .PP .nf \*(T< typedef enum sg_process_count_source { sg_entire_process_count, sg_last_process_count } sg_process_count_source; \*(T> .fi .PP .nf \*(T< typedef struct{ unsigned long long total; unsigned long long running; unsigned long long sleeping; unsigned long long stopped; unsigned long long zombie; unsigned long long unknown; time_t systime; }sg_process_count; \*(T> .fi .TP \*(T The total number of processes. .TP \*(T The number of running processes. .TP \*(T The number of sleeping processes. .TP \*(T The number of stopped processes. .TP \*(T The number of zombie processes. .TP \*(T The number of processes not matching any of above named categories. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. .SH BUGS The very first call of \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_last_process_count) will return the same as \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_entire_process_count). .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_host_info.3000644 001750 001750 00000005207 12200045616 022546 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_host_info 3 2013-06-17 i-scream "" .SH NAME sg_get_host_info, sg_get_host_info_r, sg_free_host_info \- get general operating system statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_host_info *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION These calls return details on the operating system and the machine it's running on. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l l | l | l. T{ sg_get_host_info T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_host_info_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_host_info_r\fR\*(T>() must be freed using \*(T<\fBsg_free_host_info\fR\*(T>() when not needed any more. The caller is responsible for doing it. .SH "RETURN VALUES" The structure returned is of type \*(T. .PP .nf \*(T< typedef enum { sg_unknown_configuration = 0, sg_physical_host, sg_virtual_machine, sg_paravirtual_machine, sg_hardware_virtualized } sg_host_state; \*(T> .fi .PP .nf \*(T< typedef struct{ char *os_name; char *os_release; char *os_version; char *platform; char *hostname; unsigned bitwidth; sg_host_state host_state; unsigned ncpus; unsigned maxcpus; time_t uptime; time_t systime; }sg_host_info; \*(T> .fi .TP \*(T The operating system name. (eg. SunOS or Linux) .TP \*(T The operating system release. (eg. 5.8 or 5.9 or Solaris) .TP \*(T The version level of the OS. .TP \*(T The hardware platform (architecture) the OS runs on. .TP \*(T The name of the machine. .TP \*(T The uptime of the machine in seconds. .TP \*(T The timestamp when the above stats where collected in seconds since epoch .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_free_host_info.3000644 001750 001750 00000005207 12200045616 022710 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_host_info 3 2013-06-17 i-scream "" .SH NAME sg_get_host_info, sg_get_host_info_r, sg_free_host_info \- get general operating system statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_host_info *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION These calls return details on the operating system and the machine it's running on. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l l | l | l. T{ sg_get_host_info T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_host_info_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_host_info_r\fR\*(T>() must be freed using \*(T<\fBsg_free_host_info\fR\*(T>() when not needed any more. The caller is responsible for doing it. .SH "RETURN VALUES" The structure returned is of type \*(T. .PP .nf \*(T< typedef enum { sg_unknown_configuration = 0, sg_physical_host, sg_virtual_machine, sg_paravirtual_machine, sg_hardware_virtualized } sg_host_state; \*(T> .fi .PP .nf \*(T< typedef struct{ char *os_name; char *os_release; char *os_version; char *platform; char *hostname; unsigned bitwidth; sg_host_state host_state; unsigned ncpus; unsigned maxcpus; time_t uptime; time_t systime; }sg_host_info; \*(T> .fi .TP \*(T The operating system name. (eg. SunOS or Linux) .TP \*(T The operating system release. (eg. 5.8 or 5.9 or Solaris) .TP \*(T The version level of the OS. .TP \*(T The hardware platform (architecture) the OS runs on. .TP \*(T The name of the machine. .TP \*(T The uptime of the machine in seconds. .TP \*(T The timestamp when the above stats where collected in seconds since epoch .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_cpu_stats_r.3000644 001750 001750 00000013052 12200045616 023101 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_cpu_stats 3 2013-06-17 i-scream "" .SH NAME sg_get_cpu_stats, sg_get_cpu_stats_r, sg_get_cpu_stats_diff, sg_get_cpu_stats_diff_between, sg_get_cpu_percents, sg_get_cpu_percents_of, sg_get_cpu_percents_r, sg_free_cpu_stats \- get cpu usage .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_percent_source \fIcps\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_cpu_stats *\fIwhereof\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_percents *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_cpu_stats *\fIcpu_now\fR, const sg_cpu_stats *\fIcpu_last\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION These are the categories of data delivered by the cpu stats module: \*(T<\fBsg_get_cpu_stats\fR\*(T>() and \*(T<\fBsg_get_cpu_stats_r\fR\*(T>() deliver native cpu counters since the machine has been started, \*(T<\fBsg_get_cpu_stats_diff\fR\*(T>() and \*(T<\fBsg_get_cpu_stats_diff_between\fR\*(T>() deliver native cpu counters between two \*(T<\fBsg_get_cpu_stats\fR\*(T>() calls and \*(T<\fBsg_get_cpu_percents_of\fR\*(T>() and \*(T<\fBsg_get_cpu_percents_r\fR\*(T>() deliver correlated relative cpu counters (where total is 100%). .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_cpu_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_cpu_stats_diff T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_stats_diff_between T} T{ \*(T * T} T{ caller T} T{ sg_get_cpu_percents_of T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_percents_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_cpu_stats_r\fR\*(T>() and the \*(T<\fBsg_get_cpu_stats_diff_between\fR\*(T>() as well as the \*(T buffer received from \*(T<\fBsg_get_cpu_percents_r\fR\*(T>() must be freed using \*(T<\fBsg_free_cpu_stats\fR\*(T>() or the \*(T<\fBsg_free_cpu_percents\fR\*(T>(), respectively, when not needed any more. The caller is responsible for doing it. .PP The value stored (the "ticks") will vary between operating systems. For example Solaris has a total of 100 per second, while Linux has substantially more. Also, different operating systems store different information - you won't find nice cpu on Solaris for example. .PP Modern systems shall provide information about the clock tick resolution by invoking \*(T. .SH "RETURN VALUES" There are two structures returned by the CPU statistics functions. .PP .nf \*(T< typedef struct { unsigned long long user; unsigned long long kernel; unsigned long long idle; unsigned long long iowait; unsigned long long swap; unsigned long long nice; unsigned long long total; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long syscalls; unsigned long long interrupts; unsigned long long soft_interrupts; time_t systime; } sg_cpu_stats; \*(T> .fi .PP .nf \*(T< typedef struct { double user; double kernel; double idle; double iowait; double swap; double nice; time_t time_taken; } sg_cpu_percents; \*(T> .fi .TP \*(T \*(T \*(T \*(T \*(T \*(T \*(T The different CPU states. .TP \*(T \*(T \*(T \*(T \*(T \*(T The different program actions on CPU. .TP \*(T \*(T The time taken in seconds since the last call of the function, or the system time. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_cpu_stats_diff.3000644 001750 001750 00000013052 12200045616 023550 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_cpu_stats 3 2013-06-17 i-scream "" .SH NAME sg_get_cpu_stats, sg_get_cpu_stats_r, sg_get_cpu_stats_diff, sg_get_cpu_stats_diff_between, sg_get_cpu_percents, sg_get_cpu_percents_of, sg_get_cpu_percents_r, sg_free_cpu_stats \- get cpu usage .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_percent_source \fIcps\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_cpu_stats *\fIwhereof\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_percents *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_cpu_stats *\fIcpu_now\fR, const sg_cpu_stats *\fIcpu_last\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION These are the categories of data delivered by the cpu stats module: \*(T<\fBsg_get_cpu_stats\fR\*(T>() and \*(T<\fBsg_get_cpu_stats_r\fR\*(T>() deliver native cpu counters since the machine has been started, \*(T<\fBsg_get_cpu_stats_diff\fR\*(T>() and \*(T<\fBsg_get_cpu_stats_diff_between\fR\*(T>() deliver native cpu counters between two \*(T<\fBsg_get_cpu_stats\fR\*(T>() calls and \*(T<\fBsg_get_cpu_percents_of\fR\*(T>() and \*(T<\fBsg_get_cpu_percents_r\fR\*(T>() deliver correlated relative cpu counters (where total is 100%). .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_cpu_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_cpu_stats_diff T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_stats_diff_between T} T{ \*(T * T} T{ caller T} T{ sg_get_cpu_percents_of T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_percents_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_cpu_stats_r\fR\*(T>() and the \*(T<\fBsg_get_cpu_stats_diff_between\fR\*(T>() as well as the \*(T buffer received from \*(T<\fBsg_get_cpu_percents_r\fR\*(T>() must be freed using \*(T<\fBsg_free_cpu_stats\fR\*(T>() or the \*(T<\fBsg_free_cpu_percents\fR\*(T>(), respectively, when not needed any more. The caller is responsible for doing it. .PP The value stored (the "ticks") will vary between operating systems. For example Solaris has a total of 100 per second, while Linux has substantially more. Also, different operating systems store different information - you won't find nice cpu on Solaris for example. .PP Modern systems shall provide information about the clock tick resolution by invoking \*(T. .SH "RETURN VALUES" There are two structures returned by the CPU statistics functions. .PP .nf \*(T< typedef struct { unsigned long long user; unsigned long long kernel; unsigned long long idle; unsigned long long iowait; unsigned long long swap; unsigned long long nice; unsigned long long total; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long syscalls; unsigned long long interrupts; unsigned long long soft_interrupts; time_t systime; } sg_cpu_stats; \*(T> .fi .PP .nf \*(T< typedef struct { double user; double kernel; double idle; double iowait; double swap; double nice; time_t time_taken; } sg_cpu_percents; \*(T> .fi .TP \*(T \*(T \*(T \*(T \*(T \*(T \*(T The different CPU states. .TP \*(T \*(T \*(T \*(T \*(T \*(T The different program actions on CPU. .TP \*(T \*(T The time taken in seconds since the last call of the function, or the system time. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_process_compare_name.3000644 001750 001750 00000026125 12200045617 024106 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_process_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_process_stats, sg_get_process_stats_r, sg_get_process_count, sg_get_process_count_of, sg_get_process_count_r, sg_free_process_count, sg_process_compare_name, sg_process_compare_pid, sg_process_compare_uid, sg_process_compare_gid, sg_process_compare_size, sg_process_compare_res, sg_process_compare_cpu, sg_process_compare_time \- get process statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count_source \fIpcs\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats const *\fIwhereof\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_process_stats\fR\*(T> functions provide statistics about the currently running processes. Both functions, \*(T<\fBsg_get_process_stats\fR\*(T>() and \*(T<\fBsg_get_process_stats_r\fR\*(T>(), take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The functions \*(T<\fBsg_get_process_count_of\fR\*(T>() and \*(T<\fBsg_get_process_count_r\fR\*(T>() provide an aggregated view of the process table - they deliver the amount of processes per process state. The \*(T<\fBsg_get_process_count\fR\*(T>() is in fact a preprocessor macro for backward compatibility and calls \*(T<\fBsg_get_process_count_of\fR\*(T>() with the parameter \*(T of sg_entire_process_count to emulate the behavior until 0.17. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_process_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_process_count_of T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_count_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_process_stats_r\fR\*(T>() or the \*(T summaries received from \*(T<\fBsg_get_process_count_r\fR\*(T> must be freed using \*(T<\fBsg_free_process_stats\fR\*(T>() or \*(T<\fBsg_free_process_count\fR\*(T>(), respectively. The caller is responsible for doing it when the data isn't needed any more. .PP \*(T<\fBsg_process_compare_name\fR\*(T> .br \*(T<\fBsg_process_compare_pid\fR\*(T> .br \*(T<\fBsg_process_compare_uid\fR\*(T> .br \*(T<\fBsg_process_compare_gid\fR\*(T> .br \*(T<\fBsg_process_compare_size\fR\*(T> .br \*(T<\fBsg_process_compare_res\fR\*(T> .br \*(T<\fBsg_process_compare_cpu\fR\*(T> .br \*(T<\fBsg_process_compare_time\fR\*(T> .PP These functions compare two sg_process_stats entries, and return an int to represent which one is greater. The main use of these functions is to be passed to qsort to sort the sg_process_stats by the given type. \fBExample\fR .PP .nf \*(T< size_t entries; sg_process_stats *proc_stats = NULL; while( NULL != ( proc_stats = sg_get_process_stats_r(&entries) ) ) { /* order entries by comparing the process identifier */ qsort( proc_stats, entries, sizeof(proc_stats[0]), &sg_process_compare_pid ); show_proc_stats( proc_stats ); sg_free_process_stats( proc_stats ); } \*(T> .fi .SH "RETURN VALUES" The structure returned by sg_get_process_stats is of type \*(T. .PP .nf \*(T< typedef struct { char *process_name; char *proctitle; pid_t pid; /* process identifier */ pid_t parent; /* Parent pid */ pid_t pgid; /* process id of process group leader */ pid_t sessid; /* session id of the session the process belongs to */ uid_t uid; uid_t euid; gid_t gid; gid_t egid; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long proc_size; /* in bytes */ unsigned long long proc_resident; /* in bytes */ time_t start_time; /* When was the process started */ time_t time_spent; /* time running in seconds */ double cpu_percent; int nice; sg_process_state state; time_t systime; } sg_process_stats; \*(T> .fi .PP .nf \*(T< typedef enum { SG_PROCESS_STATE_RUNNING, SG_PROCESS_STATE_SLEEPING, SG_PROCESS_STATE_STOPPED, SG_PROCESS_STATE_ZOMBIE, SG_PROCESS_STATE_UNKNOWN } sg_process_state; \*(T> .fi .TP \*(T The name of the command that was run. The content of this field heavily depends on the underlying operating system, some store the basename the executable passes to the \*(T<\fBexec\fR\*(T>(2) system call, some the entire path. Most OS restrict the size of this field - some like the *BSD family to a very low value of 15 bytes. This field is usually immutable for userland processes. .TP \*(T The command line (the "title") of the process. Take note - this can be modified by the process, so isn't guaranteed to be the original command line. .TP \*(T The process ID. .TP \*(T The parent process ID. .TP \*(T The process ID of the process group leader. .TP \*(T Session id of the session the process belongs to. .TP \*(T The ID of the user the process is running as. .TP \*(T The ID of the effective user the process is running as. .TP \*(T The ID of the group the process is running as. .TP \*(T The ID of the effective group the process is running as. .TP \*(T The number of context switches of this process (voluntary and involuntary). .TP \*(T The number of voluntary context switches of this process (eg. by calling \*(T<\fBsched_yield\fR\*(T>() or \*(T<\fBsleep\fR\*(T>()). .TP \*(T The number of involuntary context switches of this process (eg. time slice exhausted or signal sent). .TP \*(T The virtual memory size of the process in bytes. .TP \*(T The size of the process that's resident in memory. .TP \*(T The time when the process has been started in seconds since epoch. .TP \*(T The number of seconds the process has been running (user+system time, without time spent by child processes). .TP \*(T The current percentage of CPU the process is using. .TP \*(T The nice value of the process. .TP \*(T The current state of the process. See sg_process_state for permitted values. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. This might be (but doesn't have to be) the same moment for all returned entries, regardless whether they're fetched with one snapshot or puzzled from some kind of procfs. .PP The structure returned by sg_get_process_count_of and sg_get_process_count_r is of type \*(T. .PP .nf \*(T< typedef enum sg_process_count_source { sg_entire_process_count, sg_last_process_count } sg_process_count_source; \*(T> .fi .PP .nf \*(T< typedef struct{ unsigned long long total; unsigned long long running; unsigned long long sleeping; unsigned long long stopped; unsigned long long zombie; unsigned long long unknown; time_t systime; }sg_process_count; \*(T> .fi .TP \*(T The total number of processes. .TP \*(T The number of running processes. .TP \*(T The number of sleeping processes. .TP \*(T The number of stopped processes. .TP \*(T The number of zombie processes. .TP \*(T The number of processes not matching any of above named categories. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. .SH BUGS The very first call of \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_last_process_count) will return the same as \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_entire_process_count). .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_valid_filesystems.3000644 001750 001750 00000024706 12200045616 024311 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_fs_stats 3 2013-06-20 i-scream "" .SH NAME sg_get_fs_stats, sg_get_fs_stats_r, sg_get_fs_stats_diff, sg_get_fs_stats_diff_between, sg_free_fs_stats, sg_get_valid_filesystems, sg_set_valid_filesystems, sg_fs_compare_device_name, sg_fs_compare_mnt_point \- get file system statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_fs_stats *\fIcur\fR, const sg_fs_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_fs_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const char *\fIvalid_fs\fR[]);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_fs_stats\fR\*(T> functions provide statistics of mounted file systems. Both functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The \*(T<\fBsg_get_fs_stats\fR\*(T>() and \*(T<\fBsg_get_fs_stats_r\fR\*(T>() functions deliver the file system statistics of the moment the function is called. The \*(T<\fBsg_get_fs_stats_diff\fR\*(T>() and \*(T<\fBsg_get_fs_stats_diff_between\fR\*(T>() deliver the difference between two calls of \*(T<\fBsg_get_fs_stats\fR\*(T>() or \*(T<\fBsg_get_fs_stats_r\fR\*(T>(), respectively. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_fs_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_fs_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_fs_stats_diff T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_fs_stats_diff_between T} T{ \*(T * T} T{ caller T} T{ sg_get_valid_filesystems T} T{ char ** T} T{ libstatgrab (global) T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_fs_stats_r\fR\*(T>() or \*(T<\fBsg_get_fs_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_fs_stats\fR\*(T>() when not needed anymore. The caller is responsible for doing it. .PP The statgrab library comes with a built-in list of valid file system types depending on the operating system it was compiled for. Some operating systems additionally provide an API to learn the file system types known or valid to the running OS instance, which is used when detected. Nevertheless there are known problems when collecting file system statistics: network file systems are mounted from delaunched servers, file system developers run an experimental driver etc. .PP To prevent processes hang in getting file system statistics or allow developers to test their drivers, the processes may modify the list of valid file systems using the \*(T<\fBsg_get_valid_filesystems\fR\*(T>() and the \*(T<\fBsg_set_valid_filesystems\fR\*(T>(). The list of \*(T parameters both functions work with is always finished with an element pointing to NULL. .PP The returned list of \*(T<\fBsg_get_valid_filesystems\fR\*(T>() must not be modified. Always copy the list into an own structure, if you plan to extend or reduce the list: \fBRemove Network FS Example\fR .PP .nf \*(T< int compare_fs_type(const void *va, const void *vb) { const char **a = (const char **)va; const char **b = (const char **)vb; return strcmp( *a, *b ); } void filter_network_fs_types(void) { /* known network file system names on different platforms */ const char *nfs_types[] = { "nfs", "nfs3", "nfs4", "cifs", "smbfs", "samba" }; const size_t nfs_types_count = sizeof(nfs_types) / sizeof(nfs_types[0]) size_t fs_entries = 0; const char **orig_valid_fs = sg_get_valid_filesystems(&fs_entries); /* duplicate into own memory to modify list */ char **valid_fs = calloc( entries + 1, sizeof(valid_fs[0]) ); memcpy( valid_fs, orig_valid_fs, (entries + 1) * sizeof(valid_fs[0]) ); size_t i; for( i = 0; i < nfs_types_count; ++i ) { char **inv_fs = bsearch( &nfs_types[i], &valid_fs[0], fs_entries, sizeof(valid_fs[0]), compare_fs_type ); if( NULL != inv_fs ) { /* copy including trailing NULL pointer */ memmove( inv_fs, inv_fs + 1, fs_entries \- (inv_fs \- valid_fs) ); \-\-fs_entries; } } sg_set_valid_filesystems( valid_fs ); free( valid_fs ); } \*(T> .fi Note that there's no need to duplicate the strings contained in the list of valid file systems in the above example - they aren't modified. .PP The list returned by \*(T<\fBsg_get_valid_filesystems\fR\*(T>() might become invalid when used while the process makes calls to \*(T<\fBsg_set_valid_filesystems\fR\*(T>(). None of the sg_fs_stats functions protect the access to the globally used storage where the own copy of the list of the valid file systems is held. It's the responsibility of the caller not to mix configuration calls with calls to fetch statistics. .PP Additionally two support functions for \*(T<\fBqsort\fR\*(T>(3) are available: \*(T<\fBsg_fs_compare_device_name\fR\*(T>() and \*(T<\fBsg_fs_compare_mnt_point\fR\*(T>(). \fBSort Example\fR .PP .nf \*(T< size_t entries; sg_fs_stats *fs_stats = NULL; while( NULL != ( fs_stats = sg_get_fs_stats_diff(&entries) ) ) { /* order entries alphabetically using the mountpoint */ qsort( fs_stats, entries, sizeof(fs_stats[0]), &sg_fs_compare_mnt_point ); show_fs_stats( fs_stats ); } \*(T> .fi .SH "RETURN VALUES" \*(T<\fBsg_get_fs_stats\fR\*(T> returns a pointer to a structure of type \*(T. .PP .nf \*(T< typedef enum { sg_fs_unknown = 0, sg_fs_regular = 1 << 0, sg_fs_special = 1 << 1, sg_fs_loopback = 1 << 2, sg_fs_remote = 1 << 3, sg_fs_local = (sg_fs_regular | sg_fs_special), sg_fs_alltypes = (sg_fs_regular | sg_fs_special | sg_fs_loopback | sg_fs_remote) } sg_fs_device_type; \*(T> .fi .PP .nf \*(T< typedef struct { char *device_name; char *fs_type; char *mnt_point; sg_fs_device_type device_type; unsigned long long size; unsigned long long used; unsigned long long free; unsigned long long avail; unsigned long long total_inodes; unsigned long long used_inodes; unsigned long long free_inodes; unsigned long long avail_inodes; unsigned long long io_size; unsigned long long block_size; unsigned long long total_blocks; unsigned long long free_blocks; unsigned long long used_blocks; unsigned long long avail_blocks; time_t systime; } sg_fs_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be hda) .TP \*(T The file system type of the file system (eg. hpfs or ufs). .TP \*(T The mount point at which the file system is mounted. .TP \*(T The device type of the file system, currently not filled and always sg_fs_unknown. .TP \*(T The total size, in bytes, of the file system. size = used + free .TP \*(T The amount of space, in bytes, used on the file system. .TP \*(T The amount of space, in bytes, available on the file system for non-privileged users/processes (free space less reserved space). avail = free - reserved .TP \*(T The amount of space, in bytes, free on the file system. .TP \*(T The total number of inodes in the file system. .TP \*(T The number of used inodes in the file system. .TP \*(T The number of free inodes in the file system. .TP \*(T The number of free inodes available to non-privileged processes. .TP \*(T A suggested optimal block size for I/O operations -- if you're reading or writing lots of data, do it in chunks of this size. .TP \*(T The size in bytes of the minimum unit of allocation on this file system. .TP \*(T The total number of blocks in the file system. .TP \*(T The number of free blocks in the file system. .TP \*(T The number of used blocks in the file system. .TP \*(T The number of free blocks available to non-privileged processes. .TP \*(T The time in seconds since epoch when the statistic was retrieved from kernel. .SH BUGS Only mounted file systems are recognised. .PP Some file systems might be reported twice when mounted on different mount points. .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .PP Calling \*(T<\fBsg_set_valid_filesystems\fR\*(T> with an empty list with clear the internal list of valid file systems. There's currently no way to reset to the initial list. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_cpu_percents_of.3000644 001750 001750 00000013052 12200045616 023731 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_cpu_stats 3 2013-06-17 i-scream "" .SH NAME sg_get_cpu_stats, sg_get_cpu_stats_r, sg_get_cpu_stats_diff, sg_get_cpu_stats_diff_between, sg_get_cpu_percents, sg_get_cpu_percents_of, sg_get_cpu_percents_r, sg_free_cpu_stats \- get cpu usage .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_percent_source \fIcps\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_cpu_stats *\fIwhereof\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_percents *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_cpu_stats *\fIcpu_now\fR, const sg_cpu_stats *\fIcpu_last\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION These are the categories of data delivered by the cpu stats module: \*(T<\fBsg_get_cpu_stats\fR\*(T>() and \*(T<\fBsg_get_cpu_stats_r\fR\*(T>() deliver native cpu counters since the machine has been started, \*(T<\fBsg_get_cpu_stats_diff\fR\*(T>() and \*(T<\fBsg_get_cpu_stats_diff_between\fR\*(T>() deliver native cpu counters between two \*(T<\fBsg_get_cpu_stats\fR\*(T>() calls and \*(T<\fBsg_get_cpu_percents_of\fR\*(T>() and \*(T<\fBsg_get_cpu_percents_r\fR\*(T>() deliver correlated relative cpu counters (where total is 100%). .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_cpu_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_cpu_stats_diff T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_stats_diff_between T} T{ \*(T * T} T{ caller T} T{ sg_get_cpu_percents_of T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_percents_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_cpu_stats_r\fR\*(T>() and the \*(T<\fBsg_get_cpu_stats_diff_between\fR\*(T>() as well as the \*(T buffer received from \*(T<\fBsg_get_cpu_percents_r\fR\*(T>() must be freed using \*(T<\fBsg_free_cpu_stats\fR\*(T>() or the \*(T<\fBsg_free_cpu_percents\fR\*(T>(), respectively, when not needed any more. The caller is responsible for doing it. .PP The value stored (the "ticks") will vary between operating systems. For example Solaris has a total of 100 per second, while Linux has substantially more. Also, different operating systems store different information - you won't find nice cpu on Solaris for example. .PP Modern systems shall provide information about the clock tick resolution by invoking \*(T. .SH "RETURN VALUES" There are two structures returned by the CPU statistics functions. .PP .nf \*(T< typedef struct { unsigned long long user; unsigned long long kernel; unsigned long long idle; unsigned long long iowait; unsigned long long swap; unsigned long long nice; unsigned long long total; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long syscalls; unsigned long long interrupts; unsigned long long soft_interrupts; time_t systime; } sg_cpu_stats; \*(T> .fi .PP .nf \*(T< typedef struct { double user; double kernel; double idle; double iowait; double swap; double nice; time_t time_taken; } sg_cpu_percents; \*(T> .fi .TP \*(T \*(T \*(T \*(T \*(T \*(T \*(T The different CPU states. .TP \*(T \*(T \*(T \*(T \*(T \*(T The different program actions on CPU. .TP \*(T \*(T The time taken in seconds since the last call of the function, or the system time. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_shutdown.3000644 001750 001750 00000004160 12200045617 021570 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_init 3 2013-06-07 i-scream "" .SH NAME sg_init, sg_snapshot, sg_shutdown, sg_drop_privileges \- initialise libstatgrab .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(int \fIignore_init_errors\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_init\fR\*(T>() either initialises the statgrab library and sets the initialisation counter to 1, if not already done, or increases the initialisation counter. If called for the first time (in fact: if called when the initialisation counter is 0), the constructor (initialisation routine) of each registered component is invoked, some global variables are initialised, requested mutual exclusion semaphores are initialised and so on. \*(T<\fBsg_init\fR\*(T>() is protected by the mutex named "statgrab". .PP \*(T<\fBsg_snapshot\fR\*(T>() is Win32 only and will probably disappear. .PP \*(T<\fBsg_shutdown\fR\*(T>() decrements the initialisation counter. If the counter reaches zero, components' destructors are called, mutual exclusion semaphores (exept "statgrab") are destroyed etc. \*(T<\fBsg_shutdown\fR\*(T>() is protected by the mutex named "statgrab". .PP \*(T<\fBsg_drop_privileges\fR\*(T>() drops elevated privileges. .SH "RETURN VALUES" All functions return a statgrab error code. Either SG_ERROR_NONE when everything was ok or the appropriate error code from an constructor/destructor. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_user_stats_r.3000644 001750 001750 00000005607 12200045617 023300 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_user_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_user_stats, sg_get_user_stats_r, sg_free_user_stats \- get the current logged in users .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_user_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The user statistics module delivers some information about logged on users. Each logon is treated separately. Both statistic get functions, \*(T<\fBsg_get_user_stats\fR\*(T>() and \*(T<\fBsg_get_user_stats_r\fR\*(T>(), return a vector of \*(T with \*(T elements. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l l | l | l. T{ sg_get_user_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_user_stats_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T vector received from \*(T<\fBsg_get_user_stats_r\fR\*(T>() must be freed using \*(T<\fBsg_free_user_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .SH "RETURN VALUES" The structure returned is of type \*(T. .PP .nf \*(T< typedef struct { char *login_name; char *record_id; size_t record_id_size; char *device; char *hostname; pid_t pid; time_t login_time; time_t systime; } sg_user_stats; \*(T> .fi .TP \*(T The username which was used to log in .TP \*(T Record identifier of host database containing login information (not necessarily 0-terminated) .TP \*(T Size of the record identifier .TP \*(T Device name (eg. "pts/0") of the tty assigned to the login session .TP \*(T (remote) Hostname from where the user is logged on, eg. "infoterm7.some.kind.of.domain.local", "localhost", "10.42.17.4" or ":0.0" (in case it's a local logon via new xterm) .TP \*(T Process identifier of the process which made the entry to the logged on users database .TP \*(T Timestamp (time in seconds since epoch) when the user logged on .TP \*(T The timestamp when the above stats where collected in seconds since epoch .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_free_mem_stats.3000644 001750 001750 00000010454 12200045616 022714 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_mem_stats 3 2013-06-17 i-scream "" .SH NAME sg_get_mem_stats, sg_get_mem_stats_r, sg_free_mem_stats, sg_get_swap_stats, sg_get_swap_stats_r, sg_free_swap_stats \- get VM statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_mem_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_swap_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION Memory statistics are accessed through the \*(T<\fBsg_get_mem_stats\fR\*(T>() function and the \*(T<\fBsg_get_mem_stats_r\fR\*(T>() function. Both return a pointer to a \*(T buffer. Note that this statistic doesn't need to map the entire physical memory usage, it represents the real memory usable by the operating system. .PP Memory statistics are accessed through the \*(T<\fBsg_get_swap_stats\fR\*(T>() function and the \*(T<\fBsg_get_swap_stats_r\fR\*(T>() function. Both return a pointer to a \*(T buffer. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_mem_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_mem_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_swap_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_swap_stats_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_mem_stats_r\fR\*(T>() and the \*(T buffer received from \*(T<\fBsg_get_swap_stats_r\fR\*(T>() must be freed using \*(T<\fBsg_free_mem_stats\fR\*(T>() or the \*(T<\fBsg_free_swap_stats\fR\*(T>(), respectively, when not needed any more. The caller is responsible for doing it. .PP On the FreeBSD operating system elevated privileges are required to access the swap statistics. Making the program setgid kmem should be sufficient. Programs running as root will not have this problem. .SH "RETURN VALUES" The VM system calls can return a pointer to either a \*(T or a \*(T. .PP .nf \*(T< typedef struct{ unsigned long long total; unsigned long long free; unsigned long long used; unsigned long long cache; time_t systime; } sg_mem_stats; \*(T> .fi .TP \*(T The total amount of real memory in bytes. .TP \*(T The free amount of real memory in bytes. .TP \*(T The used amount of real memory in bytes. .TP \*(T The amount of real memory in bytes used for caching. .TP \*(T the timestamp when the above stats where collected in seconds since epoch .PP .nf \*(T< typedef struct { unsigned long long total; unsigned long long used; unsigned long long free; time_t systime; } sg_swap_stats; \*(T> .fi .TP \*(T The total swap space in bytes. .TP \*(T The used swap in bytes. .TP \*(T The free swap in bytes. .TP \*(T The timestamp when the above stats where collected in seconds since epoch .SH TODO Add a function to hold open the file descriptor to the kernel memory structures. Doing this would allow the elevated privileges to be dropped early on. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_disk_io_compare_name.3000644 001750 001750 00000014326 12200045616 024050 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_disk_io_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_disk_io_stats, sg_get_disk_io_stats_r, sg_get_disk_io_stats_diff, sg_get_disk_io_stats_diff_between, sg_free_disk_io_stats, sg_disk_io_compare_name, sg_disk_io_compare_traffic \- get disk io statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_disk_io_stats *\fIcur\fR, const sg_disk_io_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_disk_io_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_disk_io_stats\fR\*(T> functions provide disk I/O statistics on a per disk basis. All get- and diff-functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The \*(T<\fBsg_get_disk_io_stats\fR\*(T>() and \*(T<\fBsg_get_disk_io_stats_r\fR\*(T>() functions deliver the I/O-statistics since the disk has been attached to the system. The \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T>() and \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T>() deliver the difference between two calls of \*(T<\fBsg_get_disk_io_stats\fR\*(T>() or \*(T<\fBsg_get_disk_io_stats_r\fR\*(T>(), respectively. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_disk_io_stats T} T{ sg_disk_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_disk_io_stats_r T} T{ sg_disk_io_stats * T} T{ caller T} T{ sg_get_disk_io_stats_diff T} T{ sg_disk_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_disk_io_stats_diff_between T} T{ sg_disk_io_stats * T} T{ caller T} .TE .PP \*(T vectors got from \*(T<\fBsg_get_disk_io_stats_r\fR\*(T>() or \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_disk_io_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .PP Additionally two support functions for \*(T<\fBqsort\fR\*(T>(3) are available: \*(T<\fBsg_disk_io_compare_name\fR\*(T>() and \*(T<\fBsg_disk_io_compare_traffic\fR\*(T>(). \fBExample\fR .PP .nf \*(T< size_t entries; sg_disk_io_stats *io_stats = NULL; while( NULL != ( io_stats = sg_get_disk_io_stats_diff(&entries) ) ) { /* show disks with most traffic first */ qsort( io_stats, entries, sizeof(io_stats[0]), &sg_disk_io_compare_traffic ); show_disk_io_stats( io_stats ); } \*(T> .fi .PP On some platforms, such as Solaris 7, the kernel value is stored in a 32bit int, so wraps around when it reaches 4GB. Other platforms, such as Solaris 8 (and most other modern systems), hold the value in a 64bit int, which wraps somewhere near 17 million terabytes. The \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T>() function and the \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T>() function care about these overflows and try to detect overflows when the diff is calculated. .PP On Solaris libstatgrab will attempt to get the cXtXdXsX representation for the \*(T string. If it fails it will use a name like sd0. On some systems programs calling libstatgrab will need elevated privileges to lookup some of the names. The mappings are built up when \*(T<\fBsg_init\fR\*(T>() is called for the first time. .SH "RETURN VALUES" All diskio statistics return a pointer to a structure of type \*(T. .PP .nf \*(T< typedef struct { char *disk_name; unsigned long long read_bytes; unsigned long long write_bytes; time_t systime; } sg_disk_io_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be hda) .TP \*(T The number of bytes the disk has read. .TP \*(T The number of bytes the disk has written. .TP \*(T The time period over which \*(T and \*(T were transferred. .SH BUGS \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T> and \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T> compare two lists of disk (block device) related I/O statistics. Each entry occurring only in the second list is passed through to the resulting list as if it would have been compared to an entry with all statistic values set to 0. This implies, on the very first call \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T> will return the same as \*(T<\fBsg_get_disk_io_stats\fR\*(T>. .PP On operating systems that hold only 32bits of data there is a problem if the values wrap twice. For example, on Solaris 7 if 9GB is transferred and the operating system wraps at 4GB, the \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T>() function will return 5GB. .PP The compare functions exists rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_clear_error.3000644 001750 001750 00000003774 12200045620 022220 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_set_error 3 2013-06-07 i-scream "" .SH NAME sg_set_error, sg_set_error_with_errno, sg_set_error_with_errno_code, sg_clear_error \- sets the error condition .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error \fIcode\fR, const char *\fIarg\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error \fIcode\fR, const char *\fIarg\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error \fIcode\fR, const char *\fIarg\fR, int \fIerrno_value\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_set_error\fR\*(T>() sets the occurred error condition together with an argument. The argument is usually descriptive, eg. the file name which failed to open. .PP \*(T<\fBsg_set_error_with_errno\fR\*(T>() sets the occurred error condition together with an argument and the value of the system libraries \*(T value. The argument is usually descriptive, eg. the name of the failed \*(T<\fBsysctl\fR\*(T>() call. .PP \*(T<\fBsg_set_error_with_errno_code\fR\*(T>() sets the occurred error condition together with an argument and an error value of a system library call which doesn't set the \*(T value (eg. the pthread_* calls). The argument is usually descriptive, eg. the name of the mutex failed to get locked. .PP \*(T<\fBsg_clear_error\fR\*(T>() clears the current error condition. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_page_stats_diff_between.3000644 001750 001750 00000006764 12200045617 025423 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_page_stats 3 2013-06-17 i-scream "" .SH NAME sg_get_page_stats, sg_get_page_stats_r, sg_get_page_stats_diff, sg_get_page_stats_diff_between, sg_free_page_stats \- get paging statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_page_stats *\fIcur\fR, const sg_page_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_page_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The page stats module deliver the number of pages swapped in and out, either since the machine has been booted (by the \*(T<\fBsg_get_page_stats\fR\*(T>() and \*(T<\fBsg_get_page_stats_r\fR\*(T>() functions) or the difference between two measured statistics (by the \*(T<\fBsg_get_page_stats_diff\fR\*(T>() and \*(T<\fBsg_get_page_stats_diff_between\fR\*(T>() functions). .PP The \*(T<\fBsg_get_page_stats_diff\fR\*(T>() function calculates the difference between the last call to the function \*(T<\fBsg_get_page_stats\fR\*(T>() in this thread (the statistics of the earlier call are saved and \*(T<\fBsg_get_page_stats\fR\*(T>() is called immediately after this). .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_page_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_page_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_page_stats_diff T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_page_stats_diff_between T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_page_stats_r\fR\*(T>() and the \*(T<\fBsg_get_page_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_page_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .SH "RETURN VALUES" .nf \*(T< typedef struct{ unsigned long long pages_pagein; unsigned long long pages_pageout; time_t systime; }sg_page_stats; \*(T> .fi .TP \*(T The number of pages swapped into memory. .TP \*(T The number of pages swapped out of memory (to swap). .TP \*(T The timestamp when the above stats where collected in seconds since epoch or the time period over which \*(T and \*(T were transferred. .SH BUGS Solaris doesn't seem to report accurately. It reports the number of pages swapped into memory, not necessarily from swap. This feature isn't deemed entirely reliable. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_set_error.3000644 001750 001750 00000003774 12200045620 021725 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_set_error 3 2013-06-07 i-scream "" .SH NAME sg_set_error, sg_set_error_with_errno, sg_set_error_with_errno_code, sg_clear_error \- sets the error condition .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error \fIcode\fR, const char *\fIarg\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error \fIcode\fR, const char *\fIarg\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error \fIcode\fR, const char *\fIarg\fR, int \fIerrno_value\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_set_error\fR\*(T>() sets the occurred error condition together with an argument. The argument is usually descriptive, eg. the file name which failed to open. .PP \*(T<\fBsg_set_error_with_errno\fR\*(T>() sets the occurred error condition together with an argument and the value of the system libraries \*(T value. The argument is usually descriptive, eg. the name of the failed \*(T<\fBsysctl\fR\*(T>() call. .PP \*(T<\fBsg_set_error_with_errno_code\fR\*(T>() sets the occurred error condition together with an argument and an error value of a system library call which doesn't set the \*(T value (eg. the pthread_* calls). The argument is usually descriptive, eg. the name of the mutex failed to get locked. .PP \*(T<\fBsg_clear_error\fR\*(T>() clears the current error condition. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_network_iface_compare_name.3000644 001750 001750 00000010272 12200045617 025244 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_network_iface_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_network_iface_stats, sg_get_network_iface_stats_r, sg_free_network_iface_stats, sg_network_iface_compare_name \- get network interface statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_network_iface_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The functions \*(T<\fBsg_get_network_iface_stats\fR\*(T>() and \*(T<\fBsg_get_network_iface_stats_r\fR\*(T>() return statistics about the network interfaces in the machine. Specifically, they return the speed of the interface, the duplex state, and whether it is currently up. Both functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l l | l | l. T{ sg_get_network_iface_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_network_iface_stats_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_network_iface_stats_r\fR\*(T>() must be freed using \*(T<\fBsg_free_network_iface_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .PP Additionally a support function for \*(T<\fBqsort\fR\*(T>(3) in available: \*(T<\fBsg_network_iface_compare_name\fR\*(T>(). \fBSort Example\fR .PP .nf \*(T< size_t entries; sg_network_iface_stats *network_iface_stats = NULL; while( NULL != ( network_iface_stats = sg_get_network_iface_stats(&entries) ) ) { /* order entries alphabetically using the mountpoint */ qsort( network_iface_stats, entries, sizeof(network_iface_stats[0]), &sg_network_iface_compare_name ); show_network_iface_stats( network_iface_stats ); } \*(T> .fi .SH "RETURN VALUES" The \*(T<\fBsg_get_network_iface_stats\fR\*(T> returns a pointer to a structure of type \*(T. .PP .nf \*(T< typedef enum{ SG_IFACE_DUPLEX_FULL, SG_IFACE_DUPLEX_HALF, SG_IFACE_DUPLEX_UNKNOWN }sg_iface_duplex; \*(T> .fi .PP Note: The \*(T value could mean that duplex hasn't been negotiated yet. .PP .nf \*(T< typedef struct { char *interface_name; int speed; sg_iface_duplex duplex; int up; time_t systime; } sg_network_iface_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be eth0) .TP \*(T The speed of the interface, in megabits/sec. .TP \*(T The duplex state the interface is in. See sg_iface_duplex for permitted values. .TP \*(T Whether the interface is up. .TP \*(T The timestamp when the above stats where collected in seconds since epoch .SH BUGS Getting specific details may require elevated privileges, eg. on Linux the interface speed isn't visible to non-privileged processes. .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_fs_stats_r.3000644 001750 001750 00000024706 12200045616 022732 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_fs_stats 3 2013-06-20 i-scream "" .SH NAME sg_get_fs_stats, sg_get_fs_stats_r, sg_get_fs_stats_diff, sg_get_fs_stats_diff_between, sg_free_fs_stats, sg_get_valid_filesystems, sg_set_valid_filesystems, sg_fs_compare_device_name, sg_fs_compare_mnt_point \- get file system statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_fs_stats *\fIcur\fR, const sg_fs_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_fs_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const char *\fIvalid_fs\fR[]);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_fs_stats\fR\*(T> functions provide statistics of mounted file systems. Both functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The \*(T<\fBsg_get_fs_stats\fR\*(T>() and \*(T<\fBsg_get_fs_stats_r\fR\*(T>() functions deliver the file system statistics of the moment the function is called. The \*(T<\fBsg_get_fs_stats_diff\fR\*(T>() and \*(T<\fBsg_get_fs_stats_diff_between\fR\*(T>() deliver the difference between two calls of \*(T<\fBsg_get_fs_stats\fR\*(T>() or \*(T<\fBsg_get_fs_stats_r\fR\*(T>(), respectively. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_fs_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_fs_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_fs_stats_diff T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_fs_stats_diff_between T} T{ \*(T * T} T{ caller T} T{ sg_get_valid_filesystems T} T{ char ** T} T{ libstatgrab (global) T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_fs_stats_r\fR\*(T>() or \*(T<\fBsg_get_fs_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_fs_stats\fR\*(T>() when not needed anymore. The caller is responsible for doing it. .PP The statgrab library comes with a built-in list of valid file system types depending on the operating system it was compiled for. Some operating systems additionally provide an API to learn the file system types known or valid to the running OS instance, which is used when detected. Nevertheless there are known problems when collecting file system statistics: network file systems are mounted from delaunched servers, file system developers run an experimental driver etc. .PP To prevent processes hang in getting file system statistics or allow developers to test their drivers, the processes may modify the list of valid file systems using the \*(T<\fBsg_get_valid_filesystems\fR\*(T>() and the \*(T<\fBsg_set_valid_filesystems\fR\*(T>(). The list of \*(T parameters both functions work with is always finished with an element pointing to NULL. .PP The returned list of \*(T<\fBsg_get_valid_filesystems\fR\*(T>() must not be modified. Always copy the list into an own structure, if you plan to extend or reduce the list: \fBRemove Network FS Example\fR .PP .nf \*(T< int compare_fs_type(const void *va, const void *vb) { const char **a = (const char **)va; const char **b = (const char **)vb; return strcmp( *a, *b ); } void filter_network_fs_types(void) { /* known network file system names on different platforms */ const char *nfs_types[] = { "nfs", "nfs3", "nfs4", "cifs", "smbfs", "samba" }; const size_t nfs_types_count = sizeof(nfs_types) / sizeof(nfs_types[0]) size_t fs_entries = 0; const char **orig_valid_fs = sg_get_valid_filesystems(&fs_entries); /* duplicate into own memory to modify list */ char **valid_fs = calloc( entries + 1, sizeof(valid_fs[0]) ); memcpy( valid_fs, orig_valid_fs, (entries + 1) * sizeof(valid_fs[0]) ); size_t i; for( i = 0; i < nfs_types_count; ++i ) { char **inv_fs = bsearch( &nfs_types[i], &valid_fs[0], fs_entries, sizeof(valid_fs[0]), compare_fs_type ); if( NULL != inv_fs ) { /* copy including trailing NULL pointer */ memmove( inv_fs, inv_fs + 1, fs_entries \- (inv_fs \- valid_fs) ); \-\-fs_entries; } } sg_set_valid_filesystems( valid_fs ); free( valid_fs ); } \*(T> .fi Note that there's no need to duplicate the strings contained in the list of valid file systems in the above example - they aren't modified. .PP The list returned by \*(T<\fBsg_get_valid_filesystems\fR\*(T>() might become invalid when used while the process makes calls to \*(T<\fBsg_set_valid_filesystems\fR\*(T>(). None of the sg_fs_stats functions protect the access to the globally used storage where the own copy of the list of the valid file systems is held. It's the responsibility of the caller not to mix configuration calls with calls to fetch statistics. .PP Additionally two support functions for \*(T<\fBqsort\fR\*(T>(3) are available: \*(T<\fBsg_fs_compare_device_name\fR\*(T>() and \*(T<\fBsg_fs_compare_mnt_point\fR\*(T>(). \fBSort Example\fR .PP .nf \*(T< size_t entries; sg_fs_stats *fs_stats = NULL; while( NULL != ( fs_stats = sg_get_fs_stats_diff(&entries) ) ) { /* order entries alphabetically using the mountpoint */ qsort( fs_stats, entries, sizeof(fs_stats[0]), &sg_fs_compare_mnt_point ); show_fs_stats( fs_stats ); } \*(T> .fi .SH "RETURN VALUES" \*(T<\fBsg_get_fs_stats\fR\*(T> returns a pointer to a structure of type \*(T. .PP .nf \*(T< typedef enum { sg_fs_unknown = 0, sg_fs_regular = 1 << 0, sg_fs_special = 1 << 1, sg_fs_loopback = 1 << 2, sg_fs_remote = 1 << 3, sg_fs_local = (sg_fs_regular | sg_fs_special), sg_fs_alltypes = (sg_fs_regular | sg_fs_special | sg_fs_loopback | sg_fs_remote) } sg_fs_device_type; \*(T> .fi .PP .nf \*(T< typedef struct { char *device_name; char *fs_type; char *mnt_point; sg_fs_device_type device_type; unsigned long long size; unsigned long long used; unsigned long long free; unsigned long long avail; unsigned long long total_inodes; unsigned long long used_inodes; unsigned long long free_inodes; unsigned long long avail_inodes; unsigned long long io_size; unsigned long long block_size; unsigned long long total_blocks; unsigned long long free_blocks; unsigned long long used_blocks; unsigned long long avail_blocks; time_t systime; } sg_fs_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be hda) .TP \*(T The file system type of the file system (eg. hpfs or ufs). .TP \*(T The mount point at which the file system is mounted. .TP \*(T The device type of the file system, currently not filled and always sg_fs_unknown. .TP \*(T The total size, in bytes, of the file system. size = used + free .TP \*(T The amount of space, in bytes, used on the file system. .TP \*(T The amount of space, in bytes, available on the file system for non-privileged users/processes (free space less reserved space). avail = free - reserved .TP \*(T The amount of space, in bytes, free on the file system. .TP \*(T The total number of inodes in the file system. .TP \*(T The number of used inodes in the file system. .TP \*(T The number of free inodes in the file system. .TP \*(T The number of free inodes available to non-privileged processes. .TP \*(T A suggested optimal block size for I/O operations -- if you're reading or writing lots of data, do it in chunks of this size. .TP \*(T The size in bytes of the minimum unit of allocation on this file system. .TP \*(T The total number of blocks in the file system. .TP \*(T The number of free blocks in the file system. .TP \*(T The number of used blocks in the file system. .TP \*(T The number of free blocks available to non-privileged processes. .TP \*(T The time in seconds since epoch when the statistic was retrieved from kernel. .SH BUGS Only mounted file systems are recognised. .PP Some file systems might be reported twice when mounted on different mount points. .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .PP Calling \*(T<\fBsg_set_valid_filesystems\fR\*(T> with an empty list with clear the internal list of valid file systems. There's currently no way to reset to the initial list. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_set_valid_filesystems.3000644 001750 001750 00000024706 12200045616 024325 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_fs_stats 3 2013-06-20 i-scream "" .SH NAME sg_get_fs_stats, sg_get_fs_stats_r, sg_get_fs_stats_diff, sg_get_fs_stats_diff_between, sg_free_fs_stats, sg_get_valid_filesystems, sg_set_valid_filesystems, sg_fs_compare_device_name, sg_fs_compare_mnt_point \- get file system statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_fs_stats *\fIcur\fR, const sg_fs_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_fs_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const char *\fIvalid_fs\fR[]);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_fs_stats\fR\*(T> functions provide statistics of mounted file systems. Both functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The \*(T<\fBsg_get_fs_stats\fR\*(T>() and \*(T<\fBsg_get_fs_stats_r\fR\*(T>() functions deliver the file system statistics of the moment the function is called. The \*(T<\fBsg_get_fs_stats_diff\fR\*(T>() and \*(T<\fBsg_get_fs_stats_diff_between\fR\*(T>() deliver the difference between two calls of \*(T<\fBsg_get_fs_stats\fR\*(T>() or \*(T<\fBsg_get_fs_stats_r\fR\*(T>(), respectively. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_fs_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_fs_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_fs_stats_diff T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_fs_stats_diff_between T} T{ \*(T * T} T{ caller T} T{ sg_get_valid_filesystems T} T{ char ** T} T{ libstatgrab (global) T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_fs_stats_r\fR\*(T>() or \*(T<\fBsg_get_fs_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_fs_stats\fR\*(T>() when not needed anymore. The caller is responsible for doing it. .PP The statgrab library comes with a built-in list of valid file system types depending on the operating system it was compiled for. Some operating systems additionally provide an API to learn the file system types known or valid to the running OS instance, which is used when detected. Nevertheless there are known problems when collecting file system statistics: network file systems are mounted from delaunched servers, file system developers run an experimental driver etc. .PP To prevent processes hang in getting file system statistics or allow developers to test their drivers, the processes may modify the list of valid file systems using the \*(T<\fBsg_get_valid_filesystems\fR\*(T>() and the \*(T<\fBsg_set_valid_filesystems\fR\*(T>(). The list of \*(T parameters both functions work with is always finished with an element pointing to NULL. .PP The returned list of \*(T<\fBsg_get_valid_filesystems\fR\*(T>() must not be modified. Always copy the list into an own structure, if you plan to extend or reduce the list: \fBRemove Network FS Example\fR .PP .nf \*(T< int compare_fs_type(const void *va, const void *vb) { const char **a = (const char **)va; const char **b = (const char **)vb; return strcmp( *a, *b ); } void filter_network_fs_types(void) { /* known network file system names on different platforms */ const char *nfs_types[] = { "nfs", "nfs3", "nfs4", "cifs", "smbfs", "samba" }; const size_t nfs_types_count = sizeof(nfs_types) / sizeof(nfs_types[0]) size_t fs_entries = 0; const char **orig_valid_fs = sg_get_valid_filesystems(&fs_entries); /* duplicate into own memory to modify list */ char **valid_fs = calloc( entries + 1, sizeof(valid_fs[0]) ); memcpy( valid_fs, orig_valid_fs, (entries + 1) * sizeof(valid_fs[0]) ); size_t i; for( i = 0; i < nfs_types_count; ++i ) { char **inv_fs = bsearch( &nfs_types[i], &valid_fs[0], fs_entries, sizeof(valid_fs[0]), compare_fs_type ); if( NULL != inv_fs ) { /* copy including trailing NULL pointer */ memmove( inv_fs, inv_fs + 1, fs_entries \- (inv_fs \- valid_fs) ); \-\-fs_entries; } } sg_set_valid_filesystems( valid_fs ); free( valid_fs ); } \*(T> .fi Note that there's no need to duplicate the strings contained in the list of valid file systems in the above example - they aren't modified. .PP The list returned by \*(T<\fBsg_get_valid_filesystems\fR\*(T>() might become invalid when used while the process makes calls to \*(T<\fBsg_set_valid_filesystems\fR\*(T>(). None of the sg_fs_stats functions protect the access to the globally used storage where the own copy of the list of the valid file systems is held. It's the responsibility of the caller not to mix configuration calls with calls to fetch statistics. .PP Additionally two support functions for \*(T<\fBqsort\fR\*(T>(3) are available: \*(T<\fBsg_fs_compare_device_name\fR\*(T>() and \*(T<\fBsg_fs_compare_mnt_point\fR\*(T>(). \fBSort Example\fR .PP .nf \*(T< size_t entries; sg_fs_stats *fs_stats = NULL; while( NULL != ( fs_stats = sg_get_fs_stats_diff(&entries) ) ) { /* order entries alphabetically using the mountpoint */ qsort( fs_stats, entries, sizeof(fs_stats[0]), &sg_fs_compare_mnt_point ); show_fs_stats( fs_stats ); } \*(T> .fi .SH "RETURN VALUES" \*(T<\fBsg_get_fs_stats\fR\*(T> returns a pointer to a structure of type \*(T. .PP .nf \*(T< typedef enum { sg_fs_unknown = 0, sg_fs_regular = 1 << 0, sg_fs_special = 1 << 1, sg_fs_loopback = 1 << 2, sg_fs_remote = 1 << 3, sg_fs_local = (sg_fs_regular | sg_fs_special), sg_fs_alltypes = (sg_fs_regular | sg_fs_special | sg_fs_loopback | sg_fs_remote) } sg_fs_device_type; \*(T> .fi .PP .nf \*(T< typedef struct { char *device_name; char *fs_type; char *mnt_point; sg_fs_device_type device_type; unsigned long long size; unsigned long long used; unsigned long long free; unsigned long long avail; unsigned long long total_inodes; unsigned long long used_inodes; unsigned long long free_inodes; unsigned long long avail_inodes; unsigned long long io_size; unsigned long long block_size; unsigned long long total_blocks; unsigned long long free_blocks; unsigned long long used_blocks; unsigned long long avail_blocks; time_t systime; } sg_fs_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be hda) .TP \*(T The file system type of the file system (eg. hpfs or ufs). .TP \*(T The mount point at which the file system is mounted. .TP \*(T The device type of the file system, currently not filled and always sg_fs_unknown. .TP \*(T The total size, in bytes, of the file system. size = used + free .TP \*(T The amount of space, in bytes, used on the file system. .TP \*(T The amount of space, in bytes, available on the file system for non-privileged users/processes (free space less reserved space). avail = free - reserved .TP \*(T The amount of space, in bytes, free on the file system. .TP \*(T The total number of inodes in the file system. .TP \*(T The number of used inodes in the file system. .TP \*(T The number of free inodes in the file system. .TP \*(T The number of free inodes available to non-privileged processes. .TP \*(T A suggested optimal block size for I/O operations -- if you're reading or writing lots of data, do it in chunks of this size. .TP \*(T The size in bytes of the minimum unit of allocation on this file system. .TP \*(T The total number of blocks in the file system. .TP \*(T The number of free blocks in the file system. .TP \*(T The number of used blocks in the file system. .TP \*(T The number of free blocks available to non-privileged processes. .TP \*(T The time in seconds since epoch when the statistic was retrieved from kernel. .SH BUGS Only mounted file systems are recognised. .PP Some file systems might be reported twice when mounted on different mount points. .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .PP Calling \*(T<\fBsg_set_valid_filesystems\fR\*(T> with an empty list with clear the internal list of valid file systems. There's currently no way to reset to the initial list. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_host_info_r.3000644 001750 001750 00000005207 12200045616 023067 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_host_info 3 2013-06-17 i-scream "" .SH NAME sg_get_host_info, sg_get_host_info_r, sg_free_host_info \- get general operating system statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_host_info *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION These calls return details on the operating system and the machine it's running on. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l l | l | l. T{ sg_get_host_info T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_host_info_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_host_info_r\fR\*(T>() must be freed using \*(T<\fBsg_free_host_info\fR\*(T>() when not needed any more. The caller is responsible for doing it. .SH "RETURN VALUES" The structure returned is of type \*(T. .PP .nf \*(T< typedef enum { sg_unknown_configuration = 0, sg_physical_host, sg_virtual_machine, sg_paravirtual_machine, sg_hardware_virtualized } sg_host_state; \*(T> .fi .PP .nf \*(T< typedef struct{ char *os_name; char *os_release; char *os_version; char *platform; char *hostname; unsigned bitwidth; sg_host_state host_state; unsigned ncpus; unsigned maxcpus; time_t uptime; time_t systime; }sg_host_info; \*(T> .fi .TP \*(T The operating system name. (eg. SunOS or Linux) .TP \*(T The operating system release. (eg. 5.8 or 5.9 or Solaris) .TP \*(T The version level of the OS. .TP \*(T The hardware platform (architecture) the OS runs on. .TP \*(T The name of the machine. .TP \*(T The uptime of the machine in seconds. .TP \*(T The timestamp when the above stats where collected in seconds since epoch .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_snapshot.3000644 001750 001750 00000004160 12200045617 021554 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_init 3 2013-06-07 i-scream "" .SH NAME sg_init, sg_snapshot, sg_shutdown, sg_drop_privileges \- initialise libstatgrab .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(int \fIignore_init_errors\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_init\fR\*(T>() either initialises the statgrab library and sets the initialisation counter to 1, if not already done, or increases the initialisation counter. If called for the first time (in fact: if called when the initialisation counter is 0), the constructor (initialisation routine) of each registered component is invoked, some global variables are initialised, requested mutual exclusion semaphores are initialised and so on. \*(T<\fBsg_init\fR\*(T>() is protected by the mutex named "statgrab". .PP \*(T<\fBsg_snapshot\fR\*(T>() is Win32 only and will probably disappear. .PP \*(T<\fBsg_shutdown\fR\*(T>() decrements the initialisation counter. If the counter reaches zero, components' destructors are called, mutual exclusion semaphores (exept "statgrab") are destroyed etc. \*(T<\fBsg_shutdown\fR\*(T>() is protected by the mutex named "statgrab". .PP \*(T<\fBsg_drop_privileges\fR\*(T>() drops elevated privileges. .SH "RETURN VALUES" All functions return a statgrab error code. Either SG_ERROR_NONE when everything was ok or the appropriate error code from an constructor/destructor. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_load_stats.3000644 001750 001750 00000004153 12200045616 022712 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_load_stats 3 2013-06-17 i-scream "" .SH NAME sg_get_load_stats, sg_get_load_stats_r, sg_free_load_stats \- get system load .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_load_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION These calls returns a pointer to a buffer containing information about cumulated machine load. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l l | l | l. T{ sg_get_load_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_load_stats_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_load_stats_r\fR\*(T>() must be freed using \*(T<\fBsg_free_load_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .PP On most systems this function is just a wrapper to the \*(T<\fBgetloadavg\fR\*(T> system call. .SH "RETURN VALUES" The structure returned is of type \*(T. .PP .nf \*(T< typedef struct{ double min1; double min5; double min15; time_t systime; }sg_load_stats; \*(T> .fi .TP \*(T The load average over 1 minute. .TP \*(T The load average over 5 minutes. .TP \*(T The load average over 15 minutes. .TP \*(T The timestamp when the above stats where collected in seconds since epoch .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_page_stats_r.3000644 001750 001750 00000006764 12200045617 023243 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_page_stats 3 2013-06-17 i-scream "" .SH NAME sg_get_page_stats, sg_get_page_stats_r, sg_get_page_stats_diff, sg_get_page_stats_diff_between, sg_free_page_stats \- get paging statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_page_stats *\fIcur\fR, const sg_page_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_page_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The page stats module deliver the number of pages swapped in and out, either since the machine has been booted (by the \*(T<\fBsg_get_page_stats\fR\*(T>() and \*(T<\fBsg_get_page_stats_r\fR\*(T>() functions) or the difference between two measured statistics (by the \*(T<\fBsg_get_page_stats_diff\fR\*(T>() and \*(T<\fBsg_get_page_stats_diff_between\fR\*(T>() functions). .PP The \*(T<\fBsg_get_page_stats_diff\fR\*(T>() function calculates the difference between the last call to the function \*(T<\fBsg_get_page_stats\fR\*(T>() in this thread (the statistics of the earlier call are saved and \*(T<\fBsg_get_page_stats\fR\*(T>() is called immediately after this). .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_page_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_page_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_page_stats_diff T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_page_stats_diff_between T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_page_stats_r\fR\*(T>() and the \*(T<\fBsg_get_page_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_page_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .SH "RETURN VALUES" .nf \*(T< typedef struct{ unsigned long long pages_pagein; unsigned long long pages_pageout; time_t systime; }sg_page_stats; \*(T> .fi .TP \*(T The number of pages swapped into memory. .TP \*(T The number of pages swapped out of memory (to swap). .TP \*(T The timestamp when the above stats where collected in seconds since epoch or the time period over which \*(T and \*(T were transferred. .SH BUGS Solaris doesn't seem to report accurately. It reports the number of pages swapped into memory, not necessarily from swap. This feature isn't deemed entirely reliable. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_unlock_mutex.3000644 001750 001750 00000002355 12200045617 022436 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_lock_mutex 3 2013-06-07 i-scream "" .SH NAME sg_lock_mutex, sg_unlock_mutex \- guard not MT-safe system API .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(char const *\fImutex_name\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(char const *\fImutex_name\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION .SH "RETURN VALUES" Both functions return a statgrab error code. \fBerror code\fR: SG_ERROR_NONE .br \fBdescription\fR: No error .PP \fBerror code\fR: SG_ERROR_INVALID_ARGUMENT .br \fBdescription\fR: Unknown name for mutex .PP \fBerror code\fR: SG_ERROR_MUTEX_LOCK .br \fBdescription\fR: thread library error, error code is set with the delivered value .PP \fBerror code\fR: SG_ERROR_MUTEX_UNLOCK .br \fBdescription\fR: thread library error, error code is set with the delivered value .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_strperror.3000644 001750 001750 00000007477 12200045616 021774 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_error 3 2013-06-07 i-scream "" .SH NAME sg_get_error, sg_get_error_arg, sg_get_error_errno, sg_str_error, sg_get_error_details, sg_strperror \- get last error status .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error_details *\fIerr_details\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error \fIcode\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(char **\fIbuf\fR, const sg_error_details * const \fIerr_details\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION There are four functions to get information about the last occurred error: \*(T<\fBsg_get_error\fR\*(T>, \*(T<\fBsg_get_error_arg\fR\*(T>, \*(T<\fBsg_get_error_errno\fR\*(T> and \*(T<\fBsg_get_error_details\fR\*(T>. The remaining functions are intended to improve the machine-human-interface (e.g. the error log or a message box): \*(T<\fBsg_str_error\fR\*(T> delivers a human readable error name and \*(T<\fBsg_strperror\fR\*(T> prepares a full blown error message for printing. .PP The error argument (\*(T<\fBsg_get_error_arg\fR\*(T>) is stored thread local and is reused every time an error occures. If a later usage is intended, duplicating it is a suitable strategy. Same for the \*(T of \*(T delivered by \*(T<\fBsg_get_error_details\fR\*(T>. .PP When someone calls the function \*(T<\fBsg_get_error_details\fR\*(T> with a NULL pointer, the last error is overridden with a new one describing that \*(T<\fBsg_get_error_details\fR\*(T> is called with invalid arguments. Please be careful. .PP The function \*(T<\fBsg_strperror\fR\*(T> is allowed to be called with or without (\*(T is NULL) collected error details. In the latter case, the last occurred error of this thread is used to prepare the error message. Be aware, the the buffer pointer must be non-NULL (points to an existing \*(T lvalue), but the \*(T lvalue it points to, must be NULL. When invoked correctly, there are only two possible error conditions let \*(T<\fBsg_strperror\fR\*(T> fail: ENOMEM (out of memory) and EINVAL (invalid error code). \fBExample\fR .PP .nf \*(T< if( NULL == sg_get_cpu_stats() ) { char *buf = NULL; if( NULL != sg_strperror( &buf, NULL ) ) { fprintf( stderr, "error getting CPU stats: %s\en", buf ); free(buf); exit(255); } else { fprintf( stderr, "error getting CPU stats and error information\en" ); exit(255); } } \*(T> .fi .SH "RETURN VALUES" The error details contains following information: .PP .nf \*(T< typedef struct sg_error_details { sg_error error; int errno_value; const char *error_arg; } sg_error_details; \*(T> .fi .TP \*(T The statgrab library error code. .TP \*(T The operating system error code. .TP \*(T Additional information set when the error was reported. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_fs_stats_diff_between.3000644 001750 001750 00000024706 12200045616 025112 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_fs_stats 3 2013-06-20 i-scream "" .SH NAME sg_get_fs_stats, sg_get_fs_stats_r, sg_get_fs_stats_diff, sg_get_fs_stats_diff_between, sg_free_fs_stats, sg_get_valid_filesystems, sg_set_valid_filesystems, sg_fs_compare_device_name, sg_fs_compare_mnt_point \- get file system statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_fs_stats *\fIcur\fR, const sg_fs_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_fs_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const char *\fIvalid_fs\fR[]);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_fs_stats\fR\*(T> functions provide statistics of mounted file systems. Both functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The \*(T<\fBsg_get_fs_stats\fR\*(T>() and \*(T<\fBsg_get_fs_stats_r\fR\*(T>() functions deliver the file system statistics of the moment the function is called. The \*(T<\fBsg_get_fs_stats_diff\fR\*(T>() and \*(T<\fBsg_get_fs_stats_diff_between\fR\*(T>() deliver the difference between two calls of \*(T<\fBsg_get_fs_stats\fR\*(T>() or \*(T<\fBsg_get_fs_stats_r\fR\*(T>(), respectively. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_fs_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_fs_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_fs_stats_diff T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_fs_stats_diff_between T} T{ \*(T * T} T{ caller T} T{ sg_get_valid_filesystems T} T{ char ** T} T{ libstatgrab (global) T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_fs_stats_r\fR\*(T>() or \*(T<\fBsg_get_fs_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_fs_stats\fR\*(T>() when not needed anymore. The caller is responsible for doing it. .PP The statgrab library comes with a built-in list of valid file system types depending on the operating system it was compiled for. Some operating systems additionally provide an API to learn the file system types known or valid to the running OS instance, which is used when detected. Nevertheless there are known problems when collecting file system statistics: network file systems are mounted from delaunched servers, file system developers run an experimental driver etc. .PP To prevent processes hang in getting file system statistics or allow developers to test their drivers, the processes may modify the list of valid file systems using the \*(T<\fBsg_get_valid_filesystems\fR\*(T>() and the \*(T<\fBsg_set_valid_filesystems\fR\*(T>(). The list of \*(T parameters both functions work with is always finished with an element pointing to NULL. .PP The returned list of \*(T<\fBsg_get_valid_filesystems\fR\*(T>() must not be modified. Always copy the list into an own structure, if you plan to extend or reduce the list: \fBRemove Network FS Example\fR .PP .nf \*(T< int compare_fs_type(const void *va, const void *vb) { const char **a = (const char **)va; const char **b = (const char **)vb; return strcmp( *a, *b ); } void filter_network_fs_types(void) { /* known network file system names on different platforms */ const char *nfs_types[] = { "nfs", "nfs3", "nfs4", "cifs", "smbfs", "samba" }; const size_t nfs_types_count = sizeof(nfs_types) / sizeof(nfs_types[0]) size_t fs_entries = 0; const char **orig_valid_fs = sg_get_valid_filesystems(&fs_entries); /* duplicate into own memory to modify list */ char **valid_fs = calloc( entries + 1, sizeof(valid_fs[0]) ); memcpy( valid_fs, orig_valid_fs, (entries + 1) * sizeof(valid_fs[0]) ); size_t i; for( i = 0; i < nfs_types_count; ++i ) { char **inv_fs = bsearch( &nfs_types[i], &valid_fs[0], fs_entries, sizeof(valid_fs[0]), compare_fs_type ); if( NULL != inv_fs ) { /* copy including trailing NULL pointer */ memmove( inv_fs, inv_fs + 1, fs_entries \- (inv_fs \- valid_fs) ); \-\-fs_entries; } } sg_set_valid_filesystems( valid_fs ); free( valid_fs ); } \*(T> .fi Note that there's no need to duplicate the strings contained in the list of valid file systems in the above example - they aren't modified. .PP The list returned by \*(T<\fBsg_get_valid_filesystems\fR\*(T>() might become invalid when used while the process makes calls to \*(T<\fBsg_set_valid_filesystems\fR\*(T>(). None of the sg_fs_stats functions protect the access to the globally used storage where the own copy of the list of the valid file systems is held. It's the responsibility of the caller not to mix configuration calls with calls to fetch statistics. .PP Additionally two support functions for \*(T<\fBqsort\fR\*(T>(3) are available: \*(T<\fBsg_fs_compare_device_name\fR\*(T>() and \*(T<\fBsg_fs_compare_mnt_point\fR\*(T>(). \fBSort Example\fR .PP .nf \*(T< size_t entries; sg_fs_stats *fs_stats = NULL; while( NULL != ( fs_stats = sg_get_fs_stats_diff(&entries) ) ) { /* order entries alphabetically using the mountpoint */ qsort( fs_stats, entries, sizeof(fs_stats[0]), &sg_fs_compare_mnt_point ); show_fs_stats( fs_stats ); } \*(T> .fi .SH "RETURN VALUES" \*(T<\fBsg_get_fs_stats\fR\*(T> returns a pointer to a structure of type \*(T. .PP .nf \*(T< typedef enum { sg_fs_unknown = 0, sg_fs_regular = 1 << 0, sg_fs_special = 1 << 1, sg_fs_loopback = 1 << 2, sg_fs_remote = 1 << 3, sg_fs_local = (sg_fs_regular | sg_fs_special), sg_fs_alltypes = (sg_fs_regular | sg_fs_special | sg_fs_loopback | sg_fs_remote) } sg_fs_device_type; \*(T> .fi .PP .nf \*(T< typedef struct { char *device_name; char *fs_type; char *mnt_point; sg_fs_device_type device_type; unsigned long long size; unsigned long long used; unsigned long long free; unsigned long long avail; unsigned long long total_inodes; unsigned long long used_inodes; unsigned long long free_inodes; unsigned long long avail_inodes; unsigned long long io_size; unsigned long long block_size; unsigned long long total_blocks; unsigned long long free_blocks; unsigned long long used_blocks; unsigned long long avail_blocks; time_t systime; } sg_fs_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be hda) .TP \*(T The file system type of the file system (eg. hpfs or ufs). .TP \*(T The mount point at which the file system is mounted. .TP \*(T The device type of the file system, currently not filled and always sg_fs_unknown. .TP \*(T The total size, in bytes, of the file system. size = used + free .TP \*(T The amount of space, in bytes, used on the file system. .TP \*(T The amount of space, in bytes, available on the file system for non-privileged users/processes (free space less reserved space). avail = free - reserved .TP \*(T The amount of space, in bytes, free on the file system. .TP \*(T The total number of inodes in the file system. .TP \*(T The number of used inodes in the file system. .TP \*(T The number of free inodes in the file system. .TP \*(T The number of free inodes available to non-privileged processes. .TP \*(T A suggested optimal block size for I/O operations -- if you're reading or writing lots of data, do it in chunks of this size. .TP \*(T The size in bytes of the minimum unit of allocation on this file system. .TP \*(T The total number of blocks in the file system. .TP \*(T The number of free blocks in the file system. .TP \*(T The number of used blocks in the file system. .TP \*(T The number of free blocks available to non-privileged processes. .TP \*(T The time in seconds since epoch when the statistic was retrieved from kernel. .SH BUGS Only mounted file systems are recognised. .PP Some file systems might be reported twice when mounted on different mount points. .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .PP Calling \*(T<\fBsg_set_valid_filesystems\fR\*(T> with an empty list with clear the internal list of valid file systems. There's currently no way to reset to the initial list. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_network_io_stats_r.3000644 001750 001750 00000014226 12200045617 024477 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_network_io_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_network_io_stats, sg_get_network_io_stats_r, sg_get_network_io_stats_diff, sg_get_network_io_stats_diff_between, sg_free_network_io_stats, sg_network_io_compare_name \- get network statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_network_io_stats *\fIcur\fR, const sg_network_io_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_network_iface_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_network_io_stats\fR\*(T> functions provide network interface I/O statistics on a per interface basis. All get- and diff-functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The \*(T<\fBsg_get_network_io_stats\fR\*(T>() and \*(T<\fBsg_get_network_io_stats_r\fR\*(T>() functions deliver the I/O-statistics since the interface has been attached to the system. The \*(T<\fBsg_get_network_io_stats_diff\fR\*(T>() and \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T>() deliver the difference between two calls of \*(T<\fBsg_get_network_io_stats\fR\*(T>() or \*(T<\fBsg_get_network_io_stats_r\fR\*(T>(), respectively. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_network_io_stats T} T{ sg_network_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_network_io_stats_r T} T{ sg_network_io_stats * T} T{ caller T} T{ sg_get_network_io_stats_diff T} T{ sg_network_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_network_io_stats_diff_between T} T{ sg_network_io_stats * T} T{ caller T} .TE .PP \*(T vectors received from \*(T<\fBsg_get_network_io_stats_r\fR\*(T>() or \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_network_io_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .PP Additionally a support function for \*(T<\fBqsort\fR\*(T>(3) are available: \*(T<\fBsg_network_io_compare_name\fR\*(T>(). \fBExample\fR .PP .nf \*(T< size_t entries; sg_network_io_stats *network_stats = NULL; while( NULL != ( network_stats = sg_get_network_io_stats_diff(&entries) ) ) { /* sort interface by name */ qsort( network_stats, entries, sizeof(network_stats[0]), &sg_network_io_compare_name ); show_network_io_stats( network_stats ); } \*(T> .fi .PP \*(T<\fBsg_get_network_io_stats\fR\*(T> returns the network traffic stored in the kernel which holds the amount of data transferred since device was attached. On some platforms, such as Solaris 7, this value is stored in a 32bit int, so wraps around when it reaches 4GB. Other platforms, such as Solaris 8, hold the value in a 64bit int, which wraps somewhere near 17 million terabytes. The \*(T<\fBsg_get_network_io_stats_diff\fR\*(T>() function and the \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T>() function care about these overflows and try to detect overflows when the diff is calculated. .SH "RETURN VALUES" All network statistics return a pointer to a structure of type \*(T. .PP .nf \*(T< typedef struct { char *interface_name; unsigned long long tx; unsigned long long rx; unsigned long long ipackets; unsigned long long opackets; unsigned long long ierrors; unsigned long long oerrors; unsigned long long collisions; time_t systime; } sg_network_io_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be eth0, on AIX en0 and on FreeBSD fxp0) .TP \*(T The number of bytes transmitted. .TP \*(T The number of bytes received. .TP \*(T The number of packets received. .TP \*(T The number of packets transmitted. .TP \*(T The number of receive errors. .TP \*(T The number of transmit errors. .TP \*(T The number of collisions. .TP \*(T The timestamp when the above stats where collected in seconds since epoch or the time period over which \*(T and \*(T were transferred. .SH BUGS \*(T<\fBsg_get_network_io_stats_diff\fR\*(T> and \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T> compare two lists of network interface related I/O statistics. Each entry occurring only in the second list is passed through to the resulting list as if it would have been compared to an entry with all statistic values set to 0. This implies, on the very first call \*(T<\fBsg_get_network_io_stats_diff\fR\*(T> will return the same as \*(T<\fBsg_get_network_io_stats\fR\*(T>. .PP On operating systems that hold only 32bits of data there is a problem if the values wrap twice. For example, on Solaris 7 if 9GB is transferred and the operating system wraps at 4GB, the \*(T<\fBsg_get_network_io_stats_diff\fR\*(T> function will return 5GB. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/Makefile.am000644 001750 001750 00000006515 12200025312 021170 0ustar00tdbusers000000 000000 # Makefile for libstatgrab/docs/libstatgrab # http://www.i-scream.org/libstatgrab/ # $Id$ man_MANS = $(statgrab_MANS) $(sg_cpu_MANS) $(sg_disk_MANS) $(sg_error_MANS) \ $(sg_fs_MANS) $(sg_host_MANS) $(sg_load_MANS) $(sg_mem_MANS) \ $(sg_netif_MANS) $(sg_netio_MANS) $(sg_page_MANS) $(sg_proc_MANS) \ $(sg_user_MANS) $(sg_vect_MANS) $(sg_init_MANS) $(sg_mutex_MANS) \ $(sg_intro_MANS) $(sg_glob_MANS) $(sg_seterr_MANS) statgrab_MANS = statgrab.3 libstatgrab.3 sg_intro_MANS = sg_intro.3 sg_internal-intro.3 sg_cpu_MANS = sg_get_cpu_stats.3 sg_get_cpu_stats_r.3 \ sg_get_cpu_stats_diff.3 sg_get_cpu_stats_diff_between.3 \ sg_get_cpu_percents.3 sg_get_cpu_percents_of.3 \ sg_get_cpu_percents_r.3 sg_free_cpu_stats.3 sg_disk_MANS = sg_get_disk_io_stats.3 sg_get_disk_io_stats_r.3 \ sg_get_disk_io_stats_diff.3 sg_get_disk_io_stats_diff_between.3 \ sg_free_disk_io_stats.3 \ sg_disk_io_compare_name.3 sg_disk_io_compare_traffic.3 sg_error_MANS = sg_get_error.3 sg_get_error_arg.3 sg_get_error_errno.3 \ sg_get_error_details.3 sg_strperror.3 sg_str_error.3 sg_fs_MANS = sg_get_fs_stats.3 sg_get_fs_stats_r.3 \ sg_get_fs_stats_diff.3 sg_get_fs_stats_diff_between.3 \ sg_free_fs_stats.3 \ sg_get_valid_filesystems.3 sg_set_valid_filesystems.3 \ sg_fs_compare_device_name.3 sg_fs_compare_mnt_point.3 sg_host_MANS = sg_get_host_info.3 sg_get_host_info_r.3 sg_free_host_info.3 sg_load_MANS = sg_get_load_stats.3 sg_get_load_stats_r.3 sg_free_load_stats.3 sg_mem_MANS = sg_get_mem_stats.3 sg_get_mem_stats_r.3 sg_free_mem_stats.3 \ sg_get_swap_stats.3 sg_get_swap_stats_r.3 sg_free_swap_stats.3 sg_netif_MANS = sg_get_network_iface_stats.3 sg_get_network_iface_stats_r.3 \ sg_free_network_iface_stats.3 sg_network_iface_compare_name.3 sg_netio_MANS = sg_get_network_io_stats.3 sg_get_network_io_stats_r.3 \ sg_get_network_io_stats_diff.3 sg_get_network_io_stats_diff_between.3 \ sg_free_network_io_stats.3 sg_network_io_compare_name.3 sg_page_MANS = sg_get_page_stats.3 sg_get_page_stats_r.3 \ sg_get_page_stats_diff.3 sg_get_page_stats_diff_between.3 \ sg_free_page_stats.3 sg_proc_MANS = sg_get_process_stats.3 sg_get_process_stats_r.3 \ sg_get_process_count.3 sg_get_process_count_of.3 \ sg_get_process_count_r.3 sg_free_process_count.3 \ sg_process_compare_cpu.3 sg_process_compare_gid.3 \ sg_process_compare_name.3 sg_process_compare_pid.3 \ sg_process_compare_res.3 sg_process_compare_size.3 \ sg_process_compare_time.3 sg_process_compare_uid.3 sg_user_MANS = sg_get_user_stats.3 sg_get_user_stats_r.3 \ sg_free_user_stats.3 sg_vect_MANS = sg_vector_create.3 sg_vector_free.3 \ sg_vector_clear.3 sg_vector_resize.3 \ sg_vector_clone.3 sg_vector_clone_into.3 \ sg_vector_compute_diff.3 \ sg_get_nelements.3 sg_free_stats_buf.3 \ sg_prove_vector.3 sg_init_MANS = sg_init.3 sg_snapshot.3 sg_shutdown.3 sg_drop_privileges.3 sg_mutex_MANS = sg_lock_mutex.3 sg_unlock_mutex.3 sg_glob_MANS = sg_comp_init.3 sg_comp_destroy.3 sg_comp_get_tls.3 \ sg_global_lock.3 sg_global_unlock.3 sg_seterr_MANS= sg_set_error.3 sg_set_error_with_errno.3 sg_clear_error.3 \ sg_set_error_with_errno_code.3 sg_tools_MANS = sg_update_string.3 EXTRA_DIST = $(man_MANS) if BUILD_MANPAGES MAINTAINERCLEANFILES= $(man_MANS) .xml.3: $(DOCBOOK2MAN) -N --symlinks --string-param \ header-3="`git log -1 --format='%ad' --date=short $<`" \ $< endif libstatgrab-0.90/docs/libstatgrab/sg_get_disk_io_stats_diff_between.3000644 001750 001750 00000014326 12200045616 026120 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_disk_io_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_disk_io_stats, sg_get_disk_io_stats_r, sg_get_disk_io_stats_diff, sg_get_disk_io_stats_diff_between, sg_free_disk_io_stats, sg_disk_io_compare_name, sg_disk_io_compare_traffic \- get disk io statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_disk_io_stats *\fIcur\fR, const sg_disk_io_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_disk_io_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_disk_io_stats\fR\*(T> functions provide disk I/O statistics on a per disk basis. All get- and diff-functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The \*(T<\fBsg_get_disk_io_stats\fR\*(T>() and \*(T<\fBsg_get_disk_io_stats_r\fR\*(T>() functions deliver the I/O-statistics since the disk has been attached to the system. The \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T>() and \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T>() deliver the difference between two calls of \*(T<\fBsg_get_disk_io_stats\fR\*(T>() or \*(T<\fBsg_get_disk_io_stats_r\fR\*(T>(), respectively. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_disk_io_stats T} T{ sg_disk_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_disk_io_stats_r T} T{ sg_disk_io_stats * T} T{ caller T} T{ sg_get_disk_io_stats_diff T} T{ sg_disk_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_disk_io_stats_diff_between T} T{ sg_disk_io_stats * T} T{ caller T} .TE .PP \*(T vectors got from \*(T<\fBsg_get_disk_io_stats_r\fR\*(T>() or \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_disk_io_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .PP Additionally two support functions for \*(T<\fBqsort\fR\*(T>(3) are available: \*(T<\fBsg_disk_io_compare_name\fR\*(T>() and \*(T<\fBsg_disk_io_compare_traffic\fR\*(T>(). \fBExample\fR .PP .nf \*(T< size_t entries; sg_disk_io_stats *io_stats = NULL; while( NULL != ( io_stats = sg_get_disk_io_stats_diff(&entries) ) ) { /* show disks with most traffic first */ qsort( io_stats, entries, sizeof(io_stats[0]), &sg_disk_io_compare_traffic ); show_disk_io_stats( io_stats ); } \*(T> .fi .PP On some platforms, such as Solaris 7, the kernel value is stored in a 32bit int, so wraps around when it reaches 4GB. Other platforms, such as Solaris 8 (and most other modern systems), hold the value in a 64bit int, which wraps somewhere near 17 million terabytes. The \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T>() function and the \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T>() function care about these overflows and try to detect overflows when the diff is calculated. .PP On Solaris libstatgrab will attempt to get the cXtXdXsX representation for the \*(T string. If it fails it will use a name like sd0. On some systems programs calling libstatgrab will need elevated privileges to lookup some of the names. The mappings are built up when \*(T<\fBsg_init\fR\*(T>() is called for the first time. .SH "RETURN VALUES" All diskio statistics return a pointer to a structure of type \*(T. .PP .nf \*(T< typedef struct { char *disk_name; unsigned long long read_bytes; unsigned long long write_bytes; time_t systime; } sg_disk_io_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be hda) .TP \*(T The number of bytes the disk has read. .TP \*(T The number of bytes the disk has written. .TP \*(T The time period over which \*(T and \*(T were transferred. .SH BUGS \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T> and \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T> compare two lists of disk (block device) related I/O statistics. Each entry occurring only in the second list is passed through to the resulting list as if it would have been compared to an entry with all statistic values set to 0. This implies, on the very first call \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T> will return the same as \*(T<\fBsg_get_disk_io_stats\fR\*(T>. .PP On operating systems that hold only 32bits of data there is a problem if the values wrap twice. For example, on Solaris 7 if 9GB is transferred and the operating system wraps at 4GB, the \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T>() function will return 5GB. .PP The compare functions exists rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_process_compare_size.3000644 001750 001750 00000026125 12200045617 024140 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_process_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_process_stats, sg_get_process_stats_r, sg_get_process_count, sg_get_process_count_of, sg_get_process_count_r, sg_free_process_count, sg_process_compare_name, sg_process_compare_pid, sg_process_compare_uid, sg_process_compare_gid, sg_process_compare_size, sg_process_compare_res, sg_process_compare_cpu, sg_process_compare_time \- get process statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count_source \fIpcs\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats const *\fIwhereof\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_process_stats\fR\*(T> functions provide statistics about the currently running processes. Both functions, \*(T<\fBsg_get_process_stats\fR\*(T>() and \*(T<\fBsg_get_process_stats_r\fR\*(T>(), take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The functions \*(T<\fBsg_get_process_count_of\fR\*(T>() and \*(T<\fBsg_get_process_count_r\fR\*(T>() provide an aggregated view of the process table - they deliver the amount of processes per process state. The \*(T<\fBsg_get_process_count\fR\*(T>() is in fact a preprocessor macro for backward compatibility and calls \*(T<\fBsg_get_process_count_of\fR\*(T>() with the parameter \*(T of sg_entire_process_count to emulate the behavior until 0.17. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_process_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_process_count_of T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_count_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_process_stats_r\fR\*(T>() or the \*(T summaries received from \*(T<\fBsg_get_process_count_r\fR\*(T> must be freed using \*(T<\fBsg_free_process_stats\fR\*(T>() or \*(T<\fBsg_free_process_count\fR\*(T>(), respectively. The caller is responsible for doing it when the data isn't needed any more. .PP \*(T<\fBsg_process_compare_name\fR\*(T> .br \*(T<\fBsg_process_compare_pid\fR\*(T> .br \*(T<\fBsg_process_compare_uid\fR\*(T> .br \*(T<\fBsg_process_compare_gid\fR\*(T> .br \*(T<\fBsg_process_compare_size\fR\*(T> .br \*(T<\fBsg_process_compare_res\fR\*(T> .br \*(T<\fBsg_process_compare_cpu\fR\*(T> .br \*(T<\fBsg_process_compare_time\fR\*(T> .PP These functions compare two sg_process_stats entries, and return an int to represent which one is greater. The main use of these functions is to be passed to qsort to sort the sg_process_stats by the given type. \fBExample\fR .PP .nf \*(T< size_t entries; sg_process_stats *proc_stats = NULL; while( NULL != ( proc_stats = sg_get_process_stats_r(&entries) ) ) { /* order entries by comparing the process identifier */ qsort( proc_stats, entries, sizeof(proc_stats[0]), &sg_process_compare_pid ); show_proc_stats( proc_stats ); sg_free_process_stats( proc_stats ); } \*(T> .fi .SH "RETURN VALUES" The structure returned by sg_get_process_stats is of type \*(T. .PP .nf \*(T< typedef struct { char *process_name; char *proctitle; pid_t pid; /* process identifier */ pid_t parent; /* Parent pid */ pid_t pgid; /* process id of process group leader */ pid_t sessid; /* session id of the session the process belongs to */ uid_t uid; uid_t euid; gid_t gid; gid_t egid; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long proc_size; /* in bytes */ unsigned long long proc_resident; /* in bytes */ time_t start_time; /* When was the process started */ time_t time_spent; /* time running in seconds */ double cpu_percent; int nice; sg_process_state state; time_t systime; } sg_process_stats; \*(T> .fi .PP .nf \*(T< typedef enum { SG_PROCESS_STATE_RUNNING, SG_PROCESS_STATE_SLEEPING, SG_PROCESS_STATE_STOPPED, SG_PROCESS_STATE_ZOMBIE, SG_PROCESS_STATE_UNKNOWN } sg_process_state; \*(T> .fi .TP \*(T The name of the command that was run. The content of this field heavily depends on the underlying operating system, some store the basename the executable passes to the \*(T<\fBexec\fR\*(T>(2) system call, some the entire path. Most OS restrict the size of this field - some like the *BSD family to a very low value of 15 bytes. This field is usually immutable for userland processes. .TP \*(T The command line (the "title") of the process. Take note - this can be modified by the process, so isn't guaranteed to be the original command line. .TP \*(T The process ID. .TP \*(T The parent process ID. .TP \*(T The process ID of the process group leader. .TP \*(T Session id of the session the process belongs to. .TP \*(T The ID of the user the process is running as. .TP \*(T The ID of the effective user the process is running as. .TP \*(T The ID of the group the process is running as. .TP \*(T The ID of the effective group the process is running as. .TP \*(T The number of context switches of this process (voluntary and involuntary). .TP \*(T The number of voluntary context switches of this process (eg. by calling \*(T<\fBsched_yield\fR\*(T>() or \*(T<\fBsleep\fR\*(T>()). .TP \*(T The number of involuntary context switches of this process (eg. time slice exhausted or signal sent). .TP \*(T The virtual memory size of the process in bytes. .TP \*(T The size of the process that's resident in memory. .TP \*(T The time when the process has been started in seconds since epoch. .TP \*(T The number of seconds the process has been running (user+system time, without time spent by child processes). .TP \*(T The current percentage of CPU the process is using. .TP \*(T The nice value of the process. .TP \*(T The current state of the process. See sg_process_state for permitted values. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. This might be (but doesn't have to be) the same moment for all returned entries, regardless whether they're fetched with one snapshot or puzzled from some kind of procfs. .PP The structure returned by sg_get_process_count_of and sg_get_process_count_r is of type \*(T. .PP .nf \*(T< typedef enum sg_process_count_source { sg_entire_process_count, sg_last_process_count } sg_process_count_source; \*(T> .fi .PP .nf \*(T< typedef struct{ unsigned long long total; unsigned long long running; unsigned long long sleeping; unsigned long long stopped; unsigned long long zombie; unsigned long long unknown; time_t systime; }sg_process_count; \*(T> .fi .TP \*(T The total number of processes. .TP \*(T The number of running processes. .TP \*(T The number of sleeping processes. .TP \*(T The number of stopped processes. .TP \*(T The number of zombie processes. .TP \*(T The number of processes not matching any of above named categories. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. .SH BUGS The very first call of \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_last_process_count) will return the same as \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_entire_process_count). .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_network_iface_stats.3000644 001750 001750 00000010272 12200045617 024613 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_network_iface_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_network_iface_stats, sg_get_network_iface_stats_r, sg_free_network_iface_stats, sg_network_iface_compare_name \- get network interface statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_network_iface_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The functions \*(T<\fBsg_get_network_iface_stats\fR\*(T>() and \*(T<\fBsg_get_network_iface_stats_r\fR\*(T>() return statistics about the network interfaces in the machine. Specifically, they return the speed of the interface, the duplex state, and whether it is currently up. Both functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l l | l | l. T{ sg_get_network_iface_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_network_iface_stats_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_network_iface_stats_r\fR\*(T>() must be freed using \*(T<\fBsg_free_network_iface_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .PP Additionally a support function for \*(T<\fBqsort\fR\*(T>(3) in available: \*(T<\fBsg_network_iface_compare_name\fR\*(T>(). \fBSort Example\fR .PP .nf \*(T< size_t entries; sg_network_iface_stats *network_iface_stats = NULL; while( NULL != ( network_iface_stats = sg_get_network_iface_stats(&entries) ) ) { /* order entries alphabetically using the mountpoint */ qsort( network_iface_stats, entries, sizeof(network_iface_stats[0]), &sg_network_iface_compare_name ); show_network_iface_stats( network_iface_stats ); } \*(T> .fi .SH "RETURN VALUES" The \*(T<\fBsg_get_network_iface_stats\fR\*(T> returns a pointer to a structure of type \*(T. .PP .nf \*(T< typedef enum{ SG_IFACE_DUPLEX_FULL, SG_IFACE_DUPLEX_HALF, SG_IFACE_DUPLEX_UNKNOWN }sg_iface_duplex; \*(T> .fi .PP Note: The \*(T value could mean that duplex hasn't been negotiated yet. .PP .nf \*(T< typedef struct { char *interface_name; int speed; sg_iface_duplex duplex; int up; time_t systime; } sg_network_iface_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be eth0) .TP \*(T The speed of the interface, in megabits/sec. .TP \*(T The duplex state the interface is in. See sg_iface_duplex for permitted values. .TP \*(T Whether the interface is up. .TP \*(T The timestamp when the above stats where collected in seconds since epoch .SH BUGS Getting specific details may require elevated privileges, eg. on Linux the interface speed isn't visible to non-privileged processes. .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_process_compare_gid.3000644 001750 001750 00000026125 12200045617 023731 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_process_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_process_stats, sg_get_process_stats_r, sg_get_process_count, sg_get_process_count_of, sg_get_process_count_r, sg_free_process_count, sg_process_compare_name, sg_process_compare_pid, sg_process_compare_uid, sg_process_compare_gid, sg_process_compare_size, sg_process_compare_res, sg_process_compare_cpu, sg_process_compare_time \- get process statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count_source \fIpcs\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats const *\fIwhereof\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_process_stats\fR\*(T> functions provide statistics about the currently running processes. Both functions, \*(T<\fBsg_get_process_stats\fR\*(T>() and \*(T<\fBsg_get_process_stats_r\fR\*(T>(), take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The functions \*(T<\fBsg_get_process_count_of\fR\*(T>() and \*(T<\fBsg_get_process_count_r\fR\*(T>() provide an aggregated view of the process table - they deliver the amount of processes per process state. The \*(T<\fBsg_get_process_count\fR\*(T>() is in fact a preprocessor macro for backward compatibility and calls \*(T<\fBsg_get_process_count_of\fR\*(T>() with the parameter \*(T of sg_entire_process_count to emulate the behavior until 0.17. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_process_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_process_count_of T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_count_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_process_stats_r\fR\*(T>() or the \*(T summaries received from \*(T<\fBsg_get_process_count_r\fR\*(T> must be freed using \*(T<\fBsg_free_process_stats\fR\*(T>() or \*(T<\fBsg_free_process_count\fR\*(T>(), respectively. The caller is responsible for doing it when the data isn't needed any more. .PP \*(T<\fBsg_process_compare_name\fR\*(T> .br \*(T<\fBsg_process_compare_pid\fR\*(T> .br \*(T<\fBsg_process_compare_uid\fR\*(T> .br \*(T<\fBsg_process_compare_gid\fR\*(T> .br \*(T<\fBsg_process_compare_size\fR\*(T> .br \*(T<\fBsg_process_compare_res\fR\*(T> .br \*(T<\fBsg_process_compare_cpu\fR\*(T> .br \*(T<\fBsg_process_compare_time\fR\*(T> .PP These functions compare two sg_process_stats entries, and return an int to represent which one is greater. The main use of these functions is to be passed to qsort to sort the sg_process_stats by the given type. \fBExample\fR .PP .nf \*(T< size_t entries; sg_process_stats *proc_stats = NULL; while( NULL != ( proc_stats = sg_get_process_stats_r(&entries) ) ) { /* order entries by comparing the process identifier */ qsort( proc_stats, entries, sizeof(proc_stats[0]), &sg_process_compare_pid ); show_proc_stats( proc_stats ); sg_free_process_stats( proc_stats ); } \*(T> .fi .SH "RETURN VALUES" The structure returned by sg_get_process_stats is of type \*(T. .PP .nf \*(T< typedef struct { char *process_name; char *proctitle; pid_t pid; /* process identifier */ pid_t parent; /* Parent pid */ pid_t pgid; /* process id of process group leader */ pid_t sessid; /* session id of the session the process belongs to */ uid_t uid; uid_t euid; gid_t gid; gid_t egid; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long proc_size; /* in bytes */ unsigned long long proc_resident; /* in bytes */ time_t start_time; /* When was the process started */ time_t time_spent; /* time running in seconds */ double cpu_percent; int nice; sg_process_state state; time_t systime; } sg_process_stats; \*(T> .fi .PP .nf \*(T< typedef enum { SG_PROCESS_STATE_RUNNING, SG_PROCESS_STATE_SLEEPING, SG_PROCESS_STATE_STOPPED, SG_PROCESS_STATE_ZOMBIE, SG_PROCESS_STATE_UNKNOWN } sg_process_state; \*(T> .fi .TP \*(T The name of the command that was run. The content of this field heavily depends on the underlying operating system, some store the basename the executable passes to the \*(T<\fBexec\fR\*(T>(2) system call, some the entire path. Most OS restrict the size of this field - some like the *BSD family to a very low value of 15 bytes. This field is usually immutable for userland processes. .TP \*(T The command line (the "title") of the process. Take note - this can be modified by the process, so isn't guaranteed to be the original command line. .TP \*(T The process ID. .TP \*(T The parent process ID. .TP \*(T The process ID of the process group leader. .TP \*(T Session id of the session the process belongs to. .TP \*(T The ID of the user the process is running as. .TP \*(T The ID of the effective user the process is running as. .TP \*(T The ID of the group the process is running as. .TP \*(T The ID of the effective group the process is running as. .TP \*(T The number of context switches of this process (voluntary and involuntary). .TP \*(T The number of voluntary context switches of this process (eg. by calling \*(T<\fBsched_yield\fR\*(T>() or \*(T<\fBsleep\fR\*(T>()). .TP \*(T The number of involuntary context switches of this process (eg. time slice exhausted or signal sent). .TP \*(T The virtual memory size of the process in bytes. .TP \*(T The size of the process that's resident in memory. .TP \*(T The time when the process has been started in seconds since epoch. .TP \*(T The number of seconds the process has been running (user+system time, without time spent by child processes). .TP \*(T The current percentage of CPU the process is using. .TP \*(T The nice value of the process. .TP \*(T The current state of the process. See sg_process_state for permitted values. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. This might be (but doesn't have to be) the same moment for all returned entries, regardless whether they're fetched with one snapshot or puzzled from some kind of procfs. .PP The structure returned by sg_get_process_count_of and sg_get_process_count_r is of type \*(T. .PP .nf \*(T< typedef enum sg_process_count_source { sg_entire_process_count, sg_last_process_count } sg_process_count_source; \*(T> .fi .PP .nf \*(T< typedef struct{ unsigned long long total; unsigned long long running; unsigned long long sleeping; unsigned long long stopped; unsigned long long zombie; unsigned long long unknown; time_t systime; }sg_process_count; \*(T> .fi .TP \*(T The total number of processes. .TP \*(T The number of running processes. .TP \*(T The number of sleeping processes. .TP \*(T The number of stopped processes. .TP \*(T The number of zombie processes. .TP \*(T The number of processes not matching any of above named categories. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. .SH BUGS The very first call of \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_last_process_count) will return the same as \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_entire_process_count). .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_vector_free.3000644 001750 001750 00000027361 12200045617 022230 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_vector_create 3 2013-06-07 i-scream "" .SH NAME sg_vector_create, sg_vector_clear, sg_vector_resize, sg_vector_free, sg_vector_clone, sg_vector_clone_into, sg_vector_compute_diff, sg_prove_vector, sg_get_nelements, sg_free_stats_buf \- statgrab vector management .SH SYNOPSIS 'nh .nf \*(T<#include "statgrab.h" #include "vector.h"\*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t \fIblock_size\fR, size_t \fIalloc_count\fR, size_t \fIinitial_used\fR, const sg_vector_init_info * const \fIinfo\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const struct sg_vector *\fIsrc\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIdest\fR, const struct sg_vector *\fIsrc\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIdest\fR, const struct sg_vector *\fIcur_vector\fR, const struct sg_vector *\fIlast_vector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const struct sg_vector *\fIvec\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_vector_create\fR\*(T>() allocates and initialises a new statgrab vector with \*(T elements ready for use. Space for \*(T elements is initially allocated (to avoid too many calls to \*(T<\fBrealloc\fR\*(T>() during later \*(T<\fBsg_vector_resize\fR\*(T>() calls). The value of \*(T must be a power of 2, it's rounded up to the next power of 2 when it's not. If \*(T is not a multiple of \*(T, it's rounded up to the next multiple of \*(T. It returns a pointer to the newly created vector. .PP \*(T<\fBsg_vector_clear\fR\*(T>() destroys all elements contained in the given vector. In opposite to \*(T<\fBsg_vector_resize\fR\*(T>( x, 0 ) the allocated size of the vector remains untouched. .PP \*(T<\fBsg_vector_resize\fR\*(T>() increases or decreases the amount of allocated elements in the specified vector. The amount of allocated elements is always a multiple of the intialisation parameter \*(T. In the special case, \*(T<\fBsg_vector_resize\fR\*(T>() is called with 0 in argument \*(T, the vector is freed after all vector elements had been destroyed. It returns the pointer to the resized vector. .PP \*(T<\fBsg_vector_free\fR\*(T>() destroys all vector elements and deallocates the storage belonging to the given vector. .PP \*(T<\fBsg_vector_clone\fR\*(T>() clones all elements of the given vector into a new vector created with the same specification as the referenced one. It returns a pointer to the cloned vector. .PP \*(T<\fBsg_vector_clone_into\fR\*(T>() clones all elements of the given source vector into the given target vector. The target vector must be created for the same element data type as the source vector. It returns an error code != to SG_ERROR_NONE if something went wrong. .PP \*(T<\fBsg_vector_compute_diff\fR\*(T>() computes a difference vector between the vector containing current statistics and another vector containing older statistics. If an element exists in the current vector but not in the opposite one, it's cloned into the result vector. If an element exists only in the opposite vector, it doesn't appear in the target vector. \*(T<\fBsg_vector_compute_diff\fR\*(T>() returns an error code != to SG_ERROR_NONE if something went wrong. .PP \*(T<\fBsg_prove_vector\fR\*(T>() proves whether a pointer to a vector really points to a vector. In case the given vector pointer points to corrupted data, the program is aborted. When \*(T<\fBsg_prove_vector\fR\*(T>() returns, it returns SG_ERROR_NONE. .PP \*(T<\fBsg_get_nelements\fR\*(T>() returns the number of elements the given data area, encompasses by a statgrab vector, contains. The vector head is internally calculated from the given pointer to the first vector element. .PP \*(T<\fBsg_free_stats_buf\fR\*(T>() frees the vector emcompassing the given data area. .SH NOTES Except \*(T<\fBsg_get_nelements\fR\*(T>() and \*(T<\fBsg_free_stats_buf\fR\*(T>() none of above functions can be called from outside of the libstatgrab sources. The documented structures and APIs may change without warning. The description of all other API is intended to be read from libstatgrab developers only. .PP Each vector is created from two elements: the vector information and the list of elements: .nf \*(T< template struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; Impl vector_implementation; T elements[alloc_count]; }; \*(T> .fi Of course, it is not valid C, so being tricky was the solution: .nf \*(T< typedef struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; struct sg_vector_init_info info; } sg_vector; struct sg_vector_size_helper { struct sg_vector v; long long ll; }; #define VECTOR_SIZE offsetof(struct sg_vector_size_helper,ll) /* Return the data ptr of a vector */ #define VECTOR_DATA(vector) \e (vector ? (void *)(((char *)vector)+VECTOR_SIZE) : NULL) #define VECTOR_ADDR_ARITH(ptr) \e (sg_vector *)(((char *)(ptr))\-VECTOR_SIZE) /* Return the vector for a data */ #define VECTOR_ADDRESS(ptr) \e ((ptr) ? (SG_ERROR_NONE == sg_prove_vector(VECTOR_ADDR_ARITH(ptr)) ? VECTOR_ADDR_ARITH(ptr) : NULL ) : NULL) \*(T> .fi .PP This also allows user functions as \*(T<\fBsg_get_nelements\fR\*(T>() and \*(T<\fBsg_free_stats_buf\fR\*(T>() to switch easily between the vector structure and the content. .SS "THE VECTOR SPECIALISATION STRUCTURE" As mentioned, the vector implementation uses strategies from the object oriented programming concept named "polymorphism". A vector is described by a small object containing inherent attributes like element size and a bunch of "virtual methods" to do element related tasks like initialising or destroying elements. .PP .nf \*(T< typedef void (*vector_init_function)(void *item); typedef sg_error (*vector_copy_function)(const void *src, void *dst); typedef sg_error (*vector_compute_diff_function)(void *dst, const void *src); typedef int (*vector_compare_function)(const void *a, const void *b); typedef void (*vector_destroy_function)(void *item); struct sg_vector_init_info { size_t item_size; vector_init_function init_fn; vector_copy_function copy_fn; vector_compute_diff_function compute_diff_fn; vector_compare_function compare_fn; vector_destroy_function destroy_fn; }; \*(T> .fi .PP The instances of struct \*(T are conceptional statically initialised by using either the preprocessor macro \*(T<\fBVECTOR_INIT_INFO_FULL_INIT\fR\*(T>(\*(T) or \*(T<\fBVECTOR_INIT_INFO_EMPTY_INIT\fR\*(T>(\*(T). Here're some examples to demonstrate how it's meant: \fBInitialising CPU statistics vector description\fR .PP .nf \*(T< VECTOR_INIT_INFO_EMPTY_INIT(sg_cpu_stats); \*(T> .fi .PP \fBInitialising Host-Info statistics vector description\fR .PP .nf \*(T< static void sg_os_stats_item_init(sg_os_stats *d); static void sg_os_stats_item_destroy(sg_os_stats *d); #define sg_os_stats_item_copy NULL #define sg_os_stats_item_compute_diff NULL #define sg_os_stats_item_compare NULL VECTOR_INIT_INFO_FULL_INIT(sg_os_stats); \*(T> .fi .PP \fBInitialising Disk-IO statistics vector description\fR .PP .nf \*(T< static void sg_disk_io_stats_item_init(sg_disk_io_stats *d); static sg_error sg_disk_io_stats_item_copy(sg_disk_io_stats *d, const sg_disk_io_stats *s); static sg_error sg_disk_io_stats_item_compute_diff(const sg_disk_io_stats *s, sg_disk_io_stats *d); static int sg_disk_io_stats_item_compare(const sg_disk_io_stats *a, const sg_disk_io_stats *b); static void sg_disk_io_stats_item_destroy(sg_disk_io_stats *d); VECTOR_INIT_INFO_FULL_INIT(sg_disk_io_stats); \*(T> .fi .SS "WORKING WITH VECTORS" To simplify the working with the vector management functions, some preprocessor macros are available. They are shown here as if they were functions to ease understanding. .PP 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fItype\fR, size_t \fIblock_size\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR, size_t \fInew_count\fR, identifier \fItype\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIvectorptr\fR, size_t \fInew_count\fR, datatype *\fIdata\fR, identifier \fIdatatype\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .PP \*(T<\fBVECTOR_CREATE\fR\*(T>() calls \*(T<\fBsg_vector_create\fR\*(T>() with \*(T and \*(T using the vector specialisation \*(T. .PP \*(T<\fBVECTOR_CLEAR\fR\*(T>() simply calls \*(T<\fBsg_vector_clear\fR\*(T>(). This macro exists only for conformity. .PP \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() calls \*(T<\fBsg_vector_create\fR\*(T>() when the given vector pointer points to \*(T or \*(T<\fBsg_vector_resize\fR\*(T>() otherwise. The result of the appropriate function is returned. .PP \*(T<\fBVECTOR_UPDATE\fR\*(T>() calls \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() and sets data to the first element of the resulting vector when a non-NULL pointer got, to NULL otherwise. When \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() returns a NULL pointer and \*(T is not equal to 0 (zero), the intructions from the macro \*(T<\fBVECTOR_UPDATE_ERROR_CLEANUP\fR\*(T> are executed to cleanup before returning from current subroutine with the error which has been occurred. .PP \*(T<\fBVECTOR_ITEM_COUNT\fR\*(T>() returns 0 for a non-existing vector (\*(T == 0) and the number of containing elements otherwise. .SH "RETURN VALUES" Beside error codes, the return values, if any, are always a pointer to vector structures (struct \*(T *). .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_drop_privileges.3000644 001750 001750 00000004160 12200045617 023112 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_init 3 2013-06-07 i-scream "" .SH NAME sg_init, sg_snapshot, sg_shutdown, sg_drop_privileges \- initialise libstatgrab .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(int \fIignore_init_errors\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_init\fR\*(T>() either initialises the statgrab library and sets the initialisation counter to 1, if not already done, or increases the initialisation counter. If called for the first time (in fact: if called when the initialisation counter is 0), the constructor (initialisation routine) of each registered component is invoked, some global variables are initialised, requested mutual exclusion semaphores are initialised and so on. \*(T<\fBsg_init\fR\*(T>() is protected by the mutex named "statgrab". .PP \*(T<\fBsg_snapshot\fR\*(T>() is Win32 only and will probably disappear. .PP \*(T<\fBsg_shutdown\fR\*(T>() decrements the initialisation counter. If the counter reaches zero, components' destructors are called, mutual exclusion semaphores (exept "statgrab") are destroyed etc. \*(T<\fBsg_shutdown\fR\*(T>() is protected by the mutex named "statgrab". .PP \*(T<\fBsg_drop_privileges\fR\*(T>() drops elevated privileges. .SH "RETURN VALUES" All functions return a statgrab error code. Either SG_ERROR_NONE when everything was ok or the appropriate error code from an constructor/destructor. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_vector_clone.3000644 001750 001750 00000027361 12200045617 022407 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_vector_create 3 2013-06-07 i-scream "" .SH NAME sg_vector_create, sg_vector_clear, sg_vector_resize, sg_vector_free, sg_vector_clone, sg_vector_clone_into, sg_vector_compute_diff, sg_prove_vector, sg_get_nelements, sg_free_stats_buf \- statgrab vector management .SH SYNOPSIS 'nh .nf \*(T<#include "statgrab.h" #include "vector.h"\*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t \fIblock_size\fR, size_t \fIalloc_count\fR, size_t \fIinitial_used\fR, const sg_vector_init_info * const \fIinfo\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const struct sg_vector *\fIsrc\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIdest\fR, const struct sg_vector *\fIsrc\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIdest\fR, const struct sg_vector *\fIcur_vector\fR, const struct sg_vector *\fIlast_vector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const struct sg_vector *\fIvec\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_vector_create\fR\*(T>() allocates and initialises a new statgrab vector with \*(T elements ready for use. Space for \*(T elements is initially allocated (to avoid too many calls to \*(T<\fBrealloc\fR\*(T>() during later \*(T<\fBsg_vector_resize\fR\*(T>() calls). The value of \*(T must be a power of 2, it's rounded up to the next power of 2 when it's not. If \*(T is not a multiple of \*(T, it's rounded up to the next multiple of \*(T. It returns a pointer to the newly created vector. .PP \*(T<\fBsg_vector_clear\fR\*(T>() destroys all elements contained in the given vector. In opposite to \*(T<\fBsg_vector_resize\fR\*(T>( x, 0 ) the allocated size of the vector remains untouched. .PP \*(T<\fBsg_vector_resize\fR\*(T>() increases or decreases the amount of allocated elements in the specified vector. The amount of allocated elements is always a multiple of the intialisation parameter \*(T. In the special case, \*(T<\fBsg_vector_resize\fR\*(T>() is called with 0 in argument \*(T, the vector is freed after all vector elements had been destroyed. It returns the pointer to the resized vector. .PP \*(T<\fBsg_vector_free\fR\*(T>() destroys all vector elements and deallocates the storage belonging to the given vector. .PP \*(T<\fBsg_vector_clone\fR\*(T>() clones all elements of the given vector into a new vector created with the same specification as the referenced one. It returns a pointer to the cloned vector. .PP \*(T<\fBsg_vector_clone_into\fR\*(T>() clones all elements of the given source vector into the given target vector. The target vector must be created for the same element data type as the source vector. It returns an error code != to SG_ERROR_NONE if something went wrong. .PP \*(T<\fBsg_vector_compute_diff\fR\*(T>() computes a difference vector between the vector containing current statistics and another vector containing older statistics. If an element exists in the current vector but not in the opposite one, it's cloned into the result vector. If an element exists only in the opposite vector, it doesn't appear in the target vector. \*(T<\fBsg_vector_compute_diff\fR\*(T>() returns an error code != to SG_ERROR_NONE if something went wrong. .PP \*(T<\fBsg_prove_vector\fR\*(T>() proves whether a pointer to a vector really points to a vector. In case the given vector pointer points to corrupted data, the program is aborted. When \*(T<\fBsg_prove_vector\fR\*(T>() returns, it returns SG_ERROR_NONE. .PP \*(T<\fBsg_get_nelements\fR\*(T>() returns the number of elements the given data area, encompasses by a statgrab vector, contains. The vector head is internally calculated from the given pointer to the first vector element. .PP \*(T<\fBsg_free_stats_buf\fR\*(T>() frees the vector emcompassing the given data area. .SH NOTES Except \*(T<\fBsg_get_nelements\fR\*(T>() and \*(T<\fBsg_free_stats_buf\fR\*(T>() none of above functions can be called from outside of the libstatgrab sources. The documented structures and APIs may change without warning. The description of all other API is intended to be read from libstatgrab developers only. .PP Each vector is created from two elements: the vector information and the list of elements: .nf \*(T< template struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; Impl vector_implementation; T elements[alloc_count]; }; \*(T> .fi Of course, it is not valid C, so being tricky was the solution: .nf \*(T< typedef struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; struct sg_vector_init_info info; } sg_vector; struct sg_vector_size_helper { struct sg_vector v; long long ll; }; #define VECTOR_SIZE offsetof(struct sg_vector_size_helper,ll) /* Return the data ptr of a vector */ #define VECTOR_DATA(vector) \e (vector ? (void *)(((char *)vector)+VECTOR_SIZE) : NULL) #define VECTOR_ADDR_ARITH(ptr) \e (sg_vector *)(((char *)(ptr))\-VECTOR_SIZE) /* Return the vector for a data */ #define VECTOR_ADDRESS(ptr) \e ((ptr) ? (SG_ERROR_NONE == sg_prove_vector(VECTOR_ADDR_ARITH(ptr)) ? VECTOR_ADDR_ARITH(ptr) : NULL ) : NULL) \*(T> .fi .PP This also allows user functions as \*(T<\fBsg_get_nelements\fR\*(T>() and \*(T<\fBsg_free_stats_buf\fR\*(T>() to switch easily between the vector structure and the content. .SS "THE VECTOR SPECIALISATION STRUCTURE" As mentioned, the vector implementation uses strategies from the object oriented programming concept named "polymorphism". A vector is described by a small object containing inherent attributes like element size and a bunch of "virtual methods" to do element related tasks like initialising or destroying elements. .PP .nf \*(T< typedef void (*vector_init_function)(void *item); typedef sg_error (*vector_copy_function)(const void *src, void *dst); typedef sg_error (*vector_compute_diff_function)(void *dst, const void *src); typedef int (*vector_compare_function)(const void *a, const void *b); typedef void (*vector_destroy_function)(void *item); struct sg_vector_init_info { size_t item_size; vector_init_function init_fn; vector_copy_function copy_fn; vector_compute_diff_function compute_diff_fn; vector_compare_function compare_fn; vector_destroy_function destroy_fn; }; \*(T> .fi .PP The instances of struct \*(T are conceptional statically initialised by using either the preprocessor macro \*(T<\fBVECTOR_INIT_INFO_FULL_INIT\fR\*(T>(\*(T) or \*(T<\fBVECTOR_INIT_INFO_EMPTY_INIT\fR\*(T>(\*(T). Here're some examples to demonstrate how it's meant: \fBInitialising CPU statistics vector description\fR .PP .nf \*(T< VECTOR_INIT_INFO_EMPTY_INIT(sg_cpu_stats); \*(T> .fi .PP \fBInitialising Host-Info statistics vector description\fR .PP .nf \*(T< static void sg_os_stats_item_init(sg_os_stats *d); static void sg_os_stats_item_destroy(sg_os_stats *d); #define sg_os_stats_item_copy NULL #define sg_os_stats_item_compute_diff NULL #define sg_os_stats_item_compare NULL VECTOR_INIT_INFO_FULL_INIT(sg_os_stats); \*(T> .fi .PP \fBInitialising Disk-IO statistics vector description\fR .PP .nf \*(T< static void sg_disk_io_stats_item_init(sg_disk_io_stats *d); static sg_error sg_disk_io_stats_item_copy(sg_disk_io_stats *d, const sg_disk_io_stats *s); static sg_error sg_disk_io_stats_item_compute_diff(const sg_disk_io_stats *s, sg_disk_io_stats *d); static int sg_disk_io_stats_item_compare(const sg_disk_io_stats *a, const sg_disk_io_stats *b); static void sg_disk_io_stats_item_destroy(sg_disk_io_stats *d); VECTOR_INIT_INFO_FULL_INIT(sg_disk_io_stats); \*(T> .fi .SS "WORKING WITH VECTORS" To simplify the working with the vector management functions, some preprocessor macros are available. They are shown here as if they were functions to ease understanding. .PP 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fItype\fR, size_t \fIblock_size\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR, size_t \fInew_count\fR, identifier \fItype\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIvectorptr\fR, size_t \fInew_count\fR, datatype *\fIdata\fR, identifier \fIdatatype\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .PP \*(T<\fBVECTOR_CREATE\fR\*(T>() calls \*(T<\fBsg_vector_create\fR\*(T>() with \*(T and \*(T using the vector specialisation \*(T. .PP \*(T<\fBVECTOR_CLEAR\fR\*(T>() simply calls \*(T<\fBsg_vector_clear\fR\*(T>(). This macro exists only for conformity. .PP \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() calls \*(T<\fBsg_vector_create\fR\*(T>() when the given vector pointer points to \*(T or \*(T<\fBsg_vector_resize\fR\*(T>() otherwise. The result of the appropriate function is returned. .PP \*(T<\fBVECTOR_UPDATE\fR\*(T>() calls \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() and sets data to the first element of the resulting vector when a non-NULL pointer got, to NULL otherwise. When \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() returns a NULL pointer and \*(T is not equal to 0 (zero), the intructions from the macro \*(T<\fBVECTOR_UPDATE_ERROR_CLEANUP\fR\*(T> are executed to cleanup before returning from current subroutine with the error which has been occurred. .PP \*(T<\fBVECTOR_ITEM_COUNT\fR\*(T>() returns 0 for a non-existing vector (\*(T == 0) and the number of containing elements otherwise. .SH "RETURN VALUES" Beside error codes, the return values, if any, are always a pointer to vector structures (struct \*(T *). .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_process_compare_uid.3000644 001750 001750 00000026125 12200045617 023747 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_process_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_process_stats, sg_get_process_stats_r, sg_get_process_count, sg_get_process_count_of, sg_get_process_count_r, sg_free_process_count, sg_process_compare_name, sg_process_compare_pid, sg_process_compare_uid, sg_process_compare_gid, sg_process_compare_size, sg_process_compare_res, sg_process_compare_cpu, sg_process_compare_time \- get process statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count_source \fIpcs\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats const *\fIwhereof\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_process_stats\fR\*(T> functions provide statistics about the currently running processes. Both functions, \*(T<\fBsg_get_process_stats\fR\*(T>() and \*(T<\fBsg_get_process_stats_r\fR\*(T>(), take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The functions \*(T<\fBsg_get_process_count_of\fR\*(T>() and \*(T<\fBsg_get_process_count_r\fR\*(T>() provide an aggregated view of the process table - they deliver the amount of processes per process state. The \*(T<\fBsg_get_process_count\fR\*(T>() is in fact a preprocessor macro for backward compatibility and calls \*(T<\fBsg_get_process_count_of\fR\*(T>() with the parameter \*(T of sg_entire_process_count to emulate the behavior until 0.17. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_process_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_process_count_of T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_count_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_process_stats_r\fR\*(T>() or the \*(T summaries received from \*(T<\fBsg_get_process_count_r\fR\*(T> must be freed using \*(T<\fBsg_free_process_stats\fR\*(T>() or \*(T<\fBsg_free_process_count\fR\*(T>(), respectively. The caller is responsible for doing it when the data isn't needed any more. .PP \*(T<\fBsg_process_compare_name\fR\*(T> .br \*(T<\fBsg_process_compare_pid\fR\*(T> .br \*(T<\fBsg_process_compare_uid\fR\*(T> .br \*(T<\fBsg_process_compare_gid\fR\*(T> .br \*(T<\fBsg_process_compare_size\fR\*(T> .br \*(T<\fBsg_process_compare_res\fR\*(T> .br \*(T<\fBsg_process_compare_cpu\fR\*(T> .br \*(T<\fBsg_process_compare_time\fR\*(T> .PP These functions compare two sg_process_stats entries, and return an int to represent which one is greater. The main use of these functions is to be passed to qsort to sort the sg_process_stats by the given type. \fBExample\fR .PP .nf \*(T< size_t entries; sg_process_stats *proc_stats = NULL; while( NULL != ( proc_stats = sg_get_process_stats_r(&entries) ) ) { /* order entries by comparing the process identifier */ qsort( proc_stats, entries, sizeof(proc_stats[0]), &sg_process_compare_pid ); show_proc_stats( proc_stats ); sg_free_process_stats( proc_stats ); } \*(T> .fi .SH "RETURN VALUES" The structure returned by sg_get_process_stats is of type \*(T. .PP .nf \*(T< typedef struct { char *process_name; char *proctitle; pid_t pid; /* process identifier */ pid_t parent; /* Parent pid */ pid_t pgid; /* process id of process group leader */ pid_t sessid; /* session id of the session the process belongs to */ uid_t uid; uid_t euid; gid_t gid; gid_t egid; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long proc_size; /* in bytes */ unsigned long long proc_resident; /* in bytes */ time_t start_time; /* When was the process started */ time_t time_spent; /* time running in seconds */ double cpu_percent; int nice; sg_process_state state; time_t systime; } sg_process_stats; \*(T> .fi .PP .nf \*(T< typedef enum { SG_PROCESS_STATE_RUNNING, SG_PROCESS_STATE_SLEEPING, SG_PROCESS_STATE_STOPPED, SG_PROCESS_STATE_ZOMBIE, SG_PROCESS_STATE_UNKNOWN } sg_process_state; \*(T> .fi .TP \*(T The name of the command that was run. The content of this field heavily depends on the underlying operating system, some store the basename the executable passes to the \*(T<\fBexec\fR\*(T>(2) system call, some the entire path. Most OS restrict the size of this field - some like the *BSD family to a very low value of 15 bytes. This field is usually immutable for userland processes. .TP \*(T The command line (the "title") of the process. Take note - this can be modified by the process, so isn't guaranteed to be the original command line. .TP \*(T The process ID. .TP \*(T The parent process ID. .TP \*(T The process ID of the process group leader. .TP \*(T Session id of the session the process belongs to. .TP \*(T The ID of the user the process is running as. .TP \*(T The ID of the effective user the process is running as. .TP \*(T The ID of the group the process is running as. .TP \*(T The ID of the effective group the process is running as. .TP \*(T The number of context switches of this process (voluntary and involuntary). .TP \*(T The number of voluntary context switches of this process (eg. by calling \*(T<\fBsched_yield\fR\*(T>() or \*(T<\fBsleep\fR\*(T>()). .TP \*(T The number of involuntary context switches of this process (eg. time slice exhausted or signal sent). .TP \*(T The virtual memory size of the process in bytes. .TP \*(T The size of the process that's resident in memory. .TP \*(T The time when the process has been started in seconds since epoch. .TP \*(T The number of seconds the process has been running (user+system time, without time spent by child processes). .TP \*(T The current percentage of CPU the process is using. .TP \*(T The nice value of the process. .TP \*(T The current state of the process. See sg_process_state for permitted values. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. This might be (but doesn't have to be) the same moment for all returned entries, regardless whether they're fetched with one snapshot or puzzled from some kind of procfs. .PP The structure returned by sg_get_process_count_of and sg_get_process_count_r is of type \*(T. .PP .nf \*(T< typedef enum sg_process_count_source { sg_entire_process_count, sg_last_process_count } sg_process_count_source; \*(T> .fi .PP .nf \*(T< typedef struct{ unsigned long long total; unsigned long long running; unsigned long long sleeping; unsigned long long stopped; unsigned long long zombie; unsigned long long unknown; time_t systime; }sg_process_count; \*(T> .fi .TP \*(T The total number of processes. .TP \*(T The number of running processes. .TP \*(T The number of sleeping processes. .TP \*(T The number of stopped processes. .TP \*(T The number of zombie processes. .TP \*(T The number of processes not matching any of above named categories. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. .SH BUGS The very first call of \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_last_process_count) will return the same as \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_entire_process_count). .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_fs_compare_device_name.3000644 001750 001750 00000024706 12200045616 024361 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_fs_stats 3 2013-06-20 i-scream "" .SH NAME sg_get_fs_stats, sg_get_fs_stats_r, sg_get_fs_stats_diff, sg_get_fs_stats_diff_between, sg_free_fs_stats, sg_get_valid_filesystems, sg_set_valid_filesystems, sg_fs_compare_device_name, sg_fs_compare_mnt_point \- get file system statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_fs_stats *\fIcur\fR, const sg_fs_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_fs_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const char *\fIvalid_fs\fR[]);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_fs_stats\fR\*(T> functions provide statistics of mounted file systems. Both functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The \*(T<\fBsg_get_fs_stats\fR\*(T>() and \*(T<\fBsg_get_fs_stats_r\fR\*(T>() functions deliver the file system statistics of the moment the function is called. The \*(T<\fBsg_get_fs_stats_diff\fR\*(T>() and \*(T<\fBsg_get_fs_stats_diff_between\fR\*(T>() deliver the difference between two calls of \*(T<\fBsg_get_fs_stats\fR\*(T>() or \*(T<\fBsg_get_fs_stats_r\fR\*(T>(), respectively. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_fs_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_fs_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_fs_stats_diff T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_fs_stats_diff_between T} T{ \*(T * T} T{ caller T} T{ sg_get_valid_filesystems T} T{ char ** T} T{ libstatgrab (global) T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_fs_stats_r\fR\*(T>() or \*(T<\fBsg_get_fs_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_fs_stats\fR\*(T>() when not needed anymore. The caller is responsible for doing it. .PP The statgrab library comes with a built-in list of valid file system types depending on the operating system it was compiled for. Some operating systems additionally provide an API to learn the file system types known or valid to the running OS instance, which is used when detected. Nevertheless there are known problems when collecting file system statistics: network file systems are mounted from delaunched servers, file system developers run an experimental driver etc. .PP To prevent processes hang in getting file system statistics or allow developers to test their drivers, the processes may modify the list of valid file systems using the \*(T<\fBsg_get_valid_filesystems\fR\*(T>() and the \*(T<\fBsg_set_valid_filesystems\fR\*(T>(). The list of \*(T parameters both functions work with is always finished with an element pointing to NULL. .PP The returned list of \*(T<\fBsg_get_valid_filesystems\fR\*(T>() must not be modified. Always copy the list into an own structure, if you plan to extend or reduce the list: \fBRemove Network FS Example\fR .PP .nf \*(T< int compare_fs_type(const void *va, const void *vb) { const char **a = (const char **)va; const char **b = (const char **)vb; return strcmp( *a, *b ); } void filter_network_fs_types(void) { /* known network file system names on different platforms */ const char *nfs_types[] = { "nfs", "nfs3", "nfs4", "cifs", "smbfs", "samba" }; const size_t nfs_types_count = sizeof(nfs_types) / sizeof(nfs_types[0]) size_t fs_entries = 0; const char **orig_valid_fs = sg_get_valid_filesystems(&fs_entries); /* duplicate into own memory to modify list */ char **valid_fs = calloc( entries + 1, sizeof(valid_fs[0]) ); memcpy( valid_fs, orig_valid_fs, (entries + 1) * sizeof(valid_fs[0]) ); size_t i; for( i = 0; i < nfs_types_count; ++i ) { char **inv_fs = bsearch( &nfs_types[i], &valid_fs[0], fs_entries, sizeof(valid_fs[0]), compare_fs_type ); if( NULL != inv_fs ) { /* copy including trailing NULL pointer */ memmove( inv_fs, inv_fs + 1, fs_entries \- (inv_fs \- valid_fs) ); \-\-fs_entries; } } sg_set_valid_filesystems( valid_fs ); free( valid_fs ); } \*(T> .fi Note that there's no need to duplicate the strings contained in the list of valid file systems in the above example - they aren't modified. .PP The list returned by \*(T<\fBsg_get_valid_filesystems\fR\*(T>() might become invalid when used while the process makes calls to \*(T<\fBsg_set_valid_filesystems\fR\*(T>(). None of the sg_fs_stats functions protect the access to the globally used storage where the own copy of the list of the valid file systems is held. It's the responsibility of the caller not to mix configuration calls with calls to fetch statistics. .PP Additionally two support functions for \*(T<\fBqsort\fR\*(T>(3) are available: \*(T<\fBsg_fs_compare_device_name\fR\*(T>() and \*(T<\fBsg_fs_compare_mnt_point\fR\*(T>(). \fBSort Example\fR .PP .nf \*(T< size_t entries; sg_fs_stats *fs_stats = NULL; while( NULL != ( fs_stats = sg_get_fs_stats_diff(&entries) ) ) { /* order entries alphabetically using the mountpoint */ qsort( fs_stats, entries, sizeof(fs_stats[0]), &sg_fs_compare_mnt_point ); show_fs_stats( fs_stats ); } \*(T> .fi .SH "RETURN VALUES" \*(T<\fBsg_get_fs_stats\fR\*(T> returns a pointer to a structure of type \*(T. .PP .nf \*(T< typedef enum { sg_fs_unknown = 0, sg_fs_regular = 1 << 0, sg_fs_special = 1 << 1, sg_fs_loopback = 1 << 2, sg_fs_remote = 1 << 3, sg_fs_local = (sg_fs_regular | sg_fs_special), sg_fs_alltypes = (sg_fs_regular | sg_fs_special | sg_fs_loopback | sg_fs_remote) } sg_fs_device_type; \*(T> .fi .PP .nf \*(T< typedef struct { char *device_name; char *fs_type; char *mnt_point; sg_fs_device_type device_type; unsigned long long size; unsigned long long used; unsigned long long free; unsigned long long avail; unsigned long long total_inodes; unsigned long long used_inodes; unsigned long long free_inodes; unsigned long long avail_inodes; unsigned long long io_size; unsigned long long block_size; unsigned long long total_blocks; unsigned long long free_blocks; unsigned long long used_blocks; unsigned long long avail_blocks; time_t systime; } sg_fs_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be hda) .TP \*(T The file system type of the file system (eg. hpfs or ufs). .TP \*(T The mount point at which the file system is mounted. .TP \*(T The device type of the file system, currently not filled and always sg_fs_unknown. .TP \*(T The total size, in bytes, of the file system. size = used + free .TP \*(T The amount of space, in bytes, used on the file system. .TP \*(T The amount of space, in bytes, available on the file system for non-privileged users/processes (free space less reserved space). avail = free - reserved .TP \*(T The amount of space, in bytes, free on the file system. .TP \*(T The total number of inodes in the file system. .TP \*(T The number of used inodes in the file system. .TP \*(T The number of free inodes in the file system. .TP \*(T The number of free inodes available to non-privileged processes. .TP \*(T A suggested optimal block size for I/O operations -- if you're reading or writing lots of data, do it in chunks of this size. .TP \*(T The size in bytes of the minimum unit of allocation on this file system. .TP \*(T The total number of blocks in the file system. .TP \*(T The number of free blocks in the file system. .TP \*(T The number of used blocks in the file system. .TP \*(T The number of free blocks available to non-privileged processes. .TP \*(T The time in seconds since epoch when the statistic was retrieved from kernel. .SH BUGS Only mounted file systems are recognised. .PP Some file systems might be reported twice when mounted on different mount points. .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .PP Calling \*(T<\fBsg_set_valid_filesystems\fR\*(T> with an empty list with clear the internal list of valid file systems. There's currently no way to reset to the initial list. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_cpu_stats.3000644 001750 001750 00000013052 12200045616 022560 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_cpu_stats 3 2013-06-17 i-scream "" .SH NAME sg_get_cpu_stats, sg_get_cpu_stats_r, sg_get_cpu_stats_diff, sg_get_cpu_stats_diff_between, sg_get_cpu_percents, sg_get_cpu_percents_of, sg_get_cpu_percents_r, sg_free_cpu_stats \- get cpu usage .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_percent_source \fIcps\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_cpu_stats *\fIwhereof\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_percents *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_cpu_stats *\fIcpu_now\fR, const sg_cpu_stats *\fIcpu_last\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION These are the categories of data delivered by the cpu stats module: \*(T<\fBsg_get_cpu_stats\fR\*(T>() and \*(T<\fBsg_get_cpu_stats_r\fR\*(T>() deliver native cpu counters since the machine has been started, \*(T<\fBsg_get_cpu_stats_diff\fR\*(T>() and \*(T<\fBsg_get_cpu_stats_diff_between\fR\*(T>() deliver native cpu counters between two \*(T<\fBsg_get_cpu_stats\fR\*(T>() calls and \*(T<\fBsg_get_cpu_percents_of\fR\*(T>() and \*(T<\fBsg_get_cpu_percents_r\fR\*(T>() deliver correlated relative cpu counters (where total is 100%). .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_cpu_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_cpu_stats_diff T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_stats_diff_between T} T{ \*(T * T} T{ caller T} T{ sg_get_cpu_percents_of T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_percents_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_cpu_stats_r\fR\*(T>() and the \*(T<\fBsg_get_cpu_stats_diff_between\fR\*(T>() as well as the \*(T buffer received from \*(T<\fBsg_get_cpu_percents_r\fR\*(T>() must be freed using \*(T<\fBsg_free_cpu_stats\fR\*(T>() or the \*(T<\fBsg_free_cpu_percents\fR\*(T>(), respectively, when not needed any more. The caller is responsible for doing it. .PP The value stored (the "ticks") will vary between operating systems. For example Solaris has a total of 100 per second, while Linux has substantially more. Also, different operating systems store different information - you won't find nice cpu on Solaris for example. .PP Modern systems shall provide information about the clock tick resolution by invoking \*(T. .SH "RETURN VALUES" There are two structures returned by the CPU statistics functions. .PP .nf \*(T< typedef struct { unsigned long long user; unsigned long long kernel; unsigned long long idle; unsigned long long iowait; unsigned long long swap; unsigned long long nice; unsigned long long total; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long syscalls; unsigned long long interrupts; unsigned long long soft_interrupts; time_t systime; } sg_cpu_stats; \*(T> .fi .PP .nf \*(T< typedef struct { double user; double kernel; double idle; double iowait; double swap; double nice; time_t time_taken; } sg_cpu_percents; \*(T> .fi .TP \*(T \*(T \*(T \*(T \*(T \*(T \*(T The different CPU states. .TP \*(T \*(T \*(T \*(T \*(T \*(T The different program actions on CPU. .TP \*(T \*(T The time taken in seconds since the last call of the function, or the system time. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_lock_mutex.3000644 001750 001750 00000002355 12200045617 022073 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_lock_mutex 3 2013-06-07 i-scream "" .SH NAME sg_lock_mutex, sg_unlock_mutex \- guard not MT-safe system API .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(char const *\fImutex_name\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(char const *\fImutex_name\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION .SH "RETURN VALUES" Both functions return a statgrab error code. \fBerror code\fR: SG_ERROR_NONE .br \fBdescription\fR: No error .PP \fBerror code\fR: SG_ERROR_INVALID_ARGUMENT .br \fBdescription\fR: Unknown name for mutex .PP \fBerror code\fR: SG_ERROR_MUTEX_LOCK .br \fBdescription\fR: thread library error, error code is set with the delivered value .PP \fBerror code\fR: SG_ERROR_MUTEX_UNLOCK .br \fBdescription\fR: thread library error, error code is set with the delivered value .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_free_process_count.3000644 001750 001750 00000026125 12200045617 023611 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_process_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_process_stats, sg_get_process_stats_r, sg_get_process_count, sg_get_process_count_of, sg_get_process_count_r, sg_free_process_count, sg_process_compare_name, sg_process_compare_pid, sg_process_compare_uid, sg_process_compare_gid, sg_process_compare_size, sg_process_compare_res, sg_process_compare_cpu, sg_process_compare_time \- get process statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count_source \fIpcs\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats const *\fIwhereof\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_process_stats\fR\*(T> functions provide statistics about the currently running processes. Both functions, \*(T<\fBsg_get_process_stats\fR\*(T>() and \*(T<\fBsg_get_process_stats_r\fR\*(T>(), take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The functions \*(T<\fBsg_get_process_count_of\fR\*(T>() and \*(T<\fBsg_get_process_count_r\fR\*(T>() provide an aggregated view of the process table - they deliver the amount of processes per process state. The \*(T<\fBsg_get_process_count\fR\*(T>() is in fact a preprocessor macro for backward compatibility and calls \*(T<\fBsg_get_process_count_of\fR\*(T>() with the parameter \*(T of sg_entire_process_count to emulate the behavior until 0.17. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_process_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_process_count_of T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_process_count_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_process_stats_r\fR\*(T>() or the \*(T summaries received from \*(T<\fBsg_get_process_count_r\fR\*(T> must be freed using \*(T<\fBsg_free_process_stats\fR\*(T>() or \*(T<\fBsg_free_process_count\fR\*(T>(), respectively. The caller is responsible for doing it when the data isn't needed any more. .PP \*(T<\fBsg_process_compare_name\fR\*(T> .br \*(T<\fBsg_process_compare_pid\fR\*(T> .br \*(T<\fBsg_process_compare_uid\fR\*(T> .br \*(T<\fBsg_process_compare_gid\fR\*(T> .br \*(T<\fBsg_process_compare_size\fR\*(T> .br \*(T<\fBsg_process_compare_res\fR\*(T> .br \*(T<\fBsg_process_compare_cpu\fR\*(T> .br \*(T<\fBsg_process_compare_time\fR\*(T> .PP These functions compare two sg_process_stats entries, and return an int to represent which one is greater. The main use of these functions is to be passed to qsort to sort the sg_process_stats by the given type. \fBExample\fR .PP .nf \*(T< size_t entries; sg_process_stats *proc_stats = NULL; while( NULL != ( proc_stats = sg_get_process_stats_r(&entries) ) ) { /* order entries by comparing the process identifier */ qsort( proc_stats, entries, sizeof(proc_stats[0]), &sg_process_compare_pid ); show_proc_stats( proc_stats ); sg_free_process_stats( proc_stats ); } \*(T> .fi .SH "RETURN VALUES" The structure returned by sg_get_process_stats is of type \*(T. .PP .nf \*(T< typedef struct { char *process_name; char *proctitle; pid_t pid; /* process identifier */ pid_t parent; /* Parent pid */ pid_t pgid; /* process id of process group leader */ pid_t sessid; /* session id of the session the process belongs to */ uid_t uid; uid_t euid; gid_t gid; gid_t egid; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long proc_size; /* in bytes */ unsigned long long proc_resident; /* in bytes */ time_t start_time; /* When was the process started */ time_t time_spent; /* time running in seconds */ double cpu_percent; int nice; sg_process_state state; time_t systime; } sg_process_stats; \*(T> .fi .PP .nf \*(T< typedef enum { SG_PROCESS_STATE_RUNNING, SG_PROCESS_STATE_SLEEPING, SG_PROCESS_STATE_STOPPED, SG_PROCESS_STATE_ZOMBIE, SG_PROCESS_STATE_UNKNOWN } sg_process_state; \*(T> .fi .TP \*(T The name of the command that was run. The content of this field heavily depends on the underlying operating system, some store the basename the executable passes to the \*(T<\fBexec\fR\*(T>(2) system call, some the entire path. Most OS restrict the size of this field - some like the *BSD family to a very low value of 15 bytes. This field is usually immutable for userland processes. .TP \*(T The command line (the "title") of the process. Take note - this can be modified by the process, so isn't guaranteed to be the original command line. .TP \*(T The process ID. .TP \*(T The parent process ID. .TP \*(T The process ID of the process group leader. .TP \*(T Session id of the session the process belongs to. .TP \*(T The ID of the user the process is running as. .TP \*(T The ID of the effective user the process is running as. .TP \*(T The ID of the group the process is running as. .TP \*(T The ID of the effective group the process is running as. .TP \*(T The number of context switches of this process (voluntary and involuntary). .TP \*(T The number of voluntary context switches of this process (eg. by calling \*(T<\fBsched_yield\fR\*(T>() or \*(T<\fBsleep\fR\*(T>()). .TP \*(T The number of involuntary context switches of this process (eg. time slice exhausted or signal sent). .TP \*(T The virtual memory size of the process in bytes. .TP \*(T The size of the process that's resident in memory. .TP \*(T The time when the process has been started in seconds since epoch. .TP \*(T The number of seconds the process has been running (user+system time, without time spent by child processes). .TP \*(T The current percentage of CPU the process is using. .TP \*(T The nice value of the process. .TP \*(T The current state of the process. See sg_process_state for permitted values. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. This might be (but doesn't have to be) the same moment for all returned entries, regardless whether they're fetched with one snapshot or puzzled from some kind of procfs. .PP The structure returned by sg_get_process_count_of and sg_get_process_count_r is of type \*(T. .PP .nf \*(T< typedef enum sg_process_count_source { sg_entire_process_count, sg_last_process_count } sg_process_count_source; \*(T> .fi .PP .nf \*(T< typedef struct{ unsigned long long total; unsigned long long running; unsigned long long sleeping; unsigned long long stopped; unsigned long long zombie; unsigned long long unknown; time_t systime; }sg_process_count; \*(T> .fi .TP \*(T The total number of processes. .TP \*(T The number of running processes. .TP \*(T The number of sleeping processes. .TP \*(T The number of stopped processes. .TP \*(T The number of zombie processes. .TP \*(T The number of processes not matching any of above named categories. .TP \*(T The time in seconds since epoch of the moment where the present statistic has been created. .SH BUGS The very first call of \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_last_process_count) will return the same as \*(T<\fBsg_get_process_count_of\fR\*(T>(sg_entire_process_count). .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_network_iface_stats_r.3000644 001750 001750 00000010272 12200045617 025134 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_network_iface_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_network_iface_stats, sg_get_network_iface_stats_r, sg_free_network_iface_stats, sg_network_iface_compare_name \- get network interface statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_network_iface_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The functions \*(T<\fBsg_get_network_iface_stats\fR\*(T>() and \*(T<\fBsg_get_network_iface_stats_r\fR\*(T>() return statistics about the network interfaces in the machine. Specifically, they return the speed of the interface, the duplex state, and whether it is currently up. Both functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l l | l | l. T{ sg_get_network_iface_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_network_iface_stats_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_network_iface_stats_r\fR\*(T>() must be freed using \*(T<\fBsg_free_network_iface_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .PP Additionally a support function for \*(T<\fBqsort\fR\*(T>(3) in available: \*(T<\fBsg_network_iface_compare_name\fR\*(T>(). \fBSort Example\fR .PP .nf \*(T< size_t entries; sg_network_iface_stats *network_iface_stats = NULL; while( NULL != ( network_iface_stats = sg_get_network_iface_stats(&entries) ) ) { /* order entries alphabetically using the mountpoint */ qsort( network_iface_stats, entries, sizeof(network_iface_stats[0]), &sg_network_iface_compare_name ); show_network_iface_stats( network_iface_stats ); } \*(T> .fi .SH "RETURN VALUES" The \*(T<\fBsg_get_network_iface_stats\fR\*(T> returns a pointer to a structure of type \*(T. .PP .nf \*(T< typedef enum{ SG_IFACE_DUPLEX_FULL, SG_IFACE_DUPLEX_HALF, SG_IFACE_DUPLEX_UNKNOWN }sg_iface_duplex; \*(T> .fi .PP Note: The \*(T value could mean that duplex hasn't been negotiated yet. .PP .nf \*(T< typedef struct { char *interface_name; int speed; sg_iface_duplex duplex; int up; time_t systime; } sg_network_iface_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be eth0) .TP \*(T The speed of the interface, in megabits/sec. .TP \*(T The duplex state the interface is in. See sg_iface_duplex for permitted values. .TP \*(T Whether the interface is up. .TP \*(T The timestamp when the above stats where collected in seconds since epoch .SH BUGS Getting specific details may require elevated privileges, eg. on Linux the interface speed isn't visible to non-privileged processes. .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_disk_io_stats.3000644 001750 001750 00000014326 12200045616 023417 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_disk_io_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_disk_io_stats, sg_get_disk_io_stats_r, sg_get_disk_io_stats_diff, sg_get_disk_io_stats_diff_between, sg_free_disk_io_stats, sg_disk_io_compare_name, sg_disk_io_compare_traffic \- get disk io statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_disk_io_stats *\fIcur\fR, const sg_disk_io_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_disk_io_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_disk_io_stats\fR\*(T> functions provide disk I/O statistics on a per disk basis. All get- and diff-functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The \*(T<\fBsg_get_disk_io_stats\fR\*(T>() and \*(T<\fBsg_get_disk_io_stats_r\fR\*(T>() functions deliver the I/O-statistics since the disk has been attached to the system. The \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T>() and \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T>() deliver the difference between two calls of \*(T<\fBsg_get_disk_io_stats\fR\*(T>() or \*(T<\fBsg_get_disk_io_stats_r\fR\*(T>(), respectively. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_disk_io_stats T} T{ sg_disk_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_disk_io_stats_r T} T{ sg_disk_io_stats * T} T{ caller T} T{ sg_get_disk_io_stats_diff T} T{ sg_disk_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_disk_io_stats_diff_between T} T{ sg_disk_io_stats * T} T{ caller T} .TE .PP \*(T vectors got from \*(T<\fBsg_get_disk_io_stats_r\fR\*(T>() or \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_disk_io_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .PP Additionally two support functions for \*(T<\fBqsort\fR\*(T>(3) are available: \*(T<\fBsg_disk_io_compare_name\fR\*(T>() and \*(T<\fBsg_disk_io_compare_traffic\fR\*(T>(). \fBExample\fR .PP .nf \*(T< size_t entries; sg_disk_io_stats *io_stats = NULL; while( NULL != ( io_stats = sg_get_disk_io_stats_diff(&entries) ) ) { /* show disks with most traffic first */ qsort( io_stats, entries, sizeof(io_stats[0]), &sg_disk_io_compare_traffic ); show_disk_io_stats( io_stats ); } \*(T> .fi .PP On some platforms, such as Solaris 7, the kernel value is stored in a 32bit int, so wraps around when it reaches 4GB. Other platforms, such as Solaris 8 (and most other modern systems), hold the value in a 64bit int, which wraps somewhere near 17 million terabytes. The \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T>() function and the \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T>() function care about these overflows and try to detect overflows when the diff is calculated. .PP On Solaris libstatgrab will attempt to get the cXtXdXsX representation for the \*(T string. If it fails it will use a name like sd0. On some systems programs calling libstatgrab will need elevated privileges to lookup some of the names. The mappings are built up when \*(T<\fBsg_init\fR\*(T>() is called for the first time. .SH "RETURN VALUES" All diskio statistics return a pointer to a structure of type \*(T. .PP .nf \*(T< typedef struct { char *disk_name; unsigned long long read_bytes; unsigned long long write_bytes; time_t systime; } sg_disk_io_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be hda) .TP \*(T The number of bytes the disk has read. .TP \*(T The number of bytes the disk has written. .TP \*(T The time period over which \*(T and \*(T were transferred. .SH BUGS \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T> and \*(T<\fBsg_get_disk_io_stats_diff_between\fR\*(T> compare two lists of disk (block device) related I/O statistics. Each entry occurring only in the second list is passed through to the resulting list as if it would have been compared to an entry with all statistic values set to 0. This implies, on the very first call \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T> will return the same as \*(T<\fBsg_get_disk_io_stats\fR\*(T>. .PP On operating systems that hold only 32bits of data there is a problem if the values wrap twice. For example, on Solaris 7 if 9GB is transferred and the operating system wraps at 4GB, the \*(T<\fBsg_get_disk_io_stats_diff\fR\*(T>() function will return 5GB. .PP The compare functions exists rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_comp_destroy.3000644 001750 001750 00000026613 12200045620 022425 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_comp_init 3 2013-06-07 i-scream "" .SH NAME sg_comp_init, sg_comp_destroy, sg_comp_get_tls, sg_global_lock, sg_global_unlock \- managing system statistics delivery .SH SYNOPSIS 'nh .nf \*(T<#include "tools.h"\*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(unsigned int \fIid\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_comp_init\fR\*(T>() is called by \*(T<\fBsg_init\fR\*(T>() to run the initialisation for the globals component and each registered libstatgrab component. This registration is done statically by appending a component initialisation information structure (instance-of \*(T) to the \*(T list in \*(T<\fIsrc/libstatgrab/globals.c\fR\*(T>. The instance of \*(T is usually defined by using one of \*(T<\fBEASY_COMP_SETUP\fR\*(T>() or \*(T<\fBEXTENDED_COMP_SETUP\fR\*(T>(), respectively. .PP \*(T<\fBsg_comp_destroy\fR\*(T>() is called by \*(T<\fBsg_shutdown\fR\*(T>() to destroy all global resources, eg. translation tables for device names or compiled regular expressions to match path names etc. Statistics resources are managed somewhere else and are freed (conceptually and usually) before \*(T<\fBsg_comp_destroy\fR\*(T>() is invoked. .PP \*(T<\fBsg_comp_get_tls\fR\*(T>() is the internal function to access the thread local storage (formerly static globals) of the component. Usually it's easier to rely on the encapsulating macro \*(T<\fBGLOBAL_GET_TLS\fR\*(T>(). .SH NOTES Delivering system statistics is the job of libstatgrab, managing the delivery is the job of the globals component. To fulfil this job, the components to manage must be prepared: .TP 0.4i 1. declare component's global and TLS data structure (probably only on paper, not in code) .TP 0.4i 2. define global initialisation, thread destruction and process destruction functions (if required by 1.) .TP 0.4i 3. define component information structure using \*(T<\fB*_COMP_SETUP\fR\*(T>() .TP 0.4i 4. define component accessors using one or more of \*(T<\fBEASY_COMP_ACCESS\fR\*(T>() .br \*(T<\fBEASY_COMP_DIFF\fR\*(T>() .br \*(T<\fBMULTI_COMP_ACCESS\fR\*(T>() .br \*(T<\fBMULTI_COMP_DIFF\fR\*(T>() .PP When having done these steps, a new component delivering new statistics is born and needs to be "announced". Assuming the component is named \fIcpu\fR, append the line \*(T<{ &sg_cpu_init, 0 }\*(T> to above named \*(T list. .PP Component initialisation information in detail: .nf \*(T< typedef sg_error (*comp_global_init_function)(unsigned id); typedef void (*comp_global_destroy_function)(void); typedef void (*comp_global_cleanup_function)(void *); struct sg_comp_status { sg_error init_error; }; struct sg_comp_init { comp_global_init_function init_fn; comp_global_destroy_function destroy_fn; comp_global_cleanup_function cleanup_fn; size_t static_buf_size; #if defined(ENABLE_THREADS) && defined(HAVE_PTHREAD) const char **required_locks; #endif struct sg_comp_status *status; }; \*(T> .fi Components which do not need something special can rely on \*(T<\fBEASY_COMP_SETUP\fR\*(T>(): \fBInitialising memory component\fR .PP .nf \*(T< EASY_COMP_SETUP(mem,1,NULL); \*(T> .fi When own initialisation is needed, doing it is a bit more complex: \fBInitialising network component\fR .PP .nf \*(T< #define SG_NETWORK_IO_NOW_IDX 0 #define SG_NETWORK_IO_DIFF_IDX 1 #define SG_NETWORK_IFACE_IDX 2 #define SG_NETWORK_MAX_IDX 3 EXTENDED_COMP_SETUP(network,SG_NETWORK_MAX_IDX,NULL); #ifdef LINUX static regex_t network_io_rx; #define RX_MATCH_COUNT (8+1) #endif sg_error sg_network_init_comp(unsigned id) { GLOBAL_SET_ID(network,id); #ifdef LINUX if( regcomp( &network_io_rx, ..., REG_EXTENDED)!=0) { return sg_set_error(SG_ERROR_PARSE, NULL); } #endif return SG_ERROR_NONE; } void sg_network_destroy_comp(void) { #ifdef LINUX regfree(&network_io_rx); #endif } EASY_COMP_CLEANUP_FN(network,SG_NETWORK_MAX_IDX) \*(T> .fi .SS "MACROS TO WORK WITH THE COMPONENT MANAGER" To simplify working with the component management functions, some preprocessor macros are available. They are shown here as if they were functions to ease understanding. .PP 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, \fI...\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, size_t \fInvect\fR, \fI...\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, size_t \fInvect\fR, \fI...\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, unsigned int \fIid\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, size_t \fInvect\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIfn\fR, identifier \fIcomp\fR, identifier \fIstat\fR, size_t \fIidx\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIfn\fR, identifier \fIcomp\fR, identifier \fIstat\fR, size_t \fIidx\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIfn\fR, identifier \fIgetfn\fR, identifier \fIcomp\fR, identifier \fIstat\fR, size_t \fIdiffidx\fR, size_t \fInowidx\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIfn\fR, identifier \fIgetfn\fR, identifier \fIcomp\fR, identifier \fIstat\fR, size_t \fIdiffidx\fR, size_t \fInowidx\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .PP \*(T<\fBEASY_COMP_SETUP\fR\*(T>() cares about anything to be automatically done for instantiating a component information structure for the specified component \*(T. The created TLS storage structure will hold \*(T pointer elements and that's it. All initialisation, destruction and cleanup-routines are created as needed using \*(T<\fBEASY_COMP_INIT_FN\fR\*(T>(), \*(T<\fBEASY_COMP_DESTROY_FN\fR\*(T>() and \*(T<\fBEASY_COMP_CLEANUP_FN\fR\*(T>(). After the amount of required vector pointers to be stored the list of required mutexes must be specified, finished with a NULL pointer. .PP \*(T<\fBEXTENDED_COMP_SETUP\fR\*(T>() cares about anything to be automatically done for instantiating an component information structure for the specified component \*(T but the required defintion of the initialisation, destruction and cleanup routines. The created TLS storage structure will hold \*(T pointer elements and that's it. After the amount of required vector pointers to be stored, the list of required mutexes must be specified, finished with a NULL pointer. All standard routines can be created semi-automatically using \*(T<\fBEASY_COMP_INIT_FN\fR\*(T>(), \*(T<\fBEASY_COMP_DESTROY_FN\fR\*(T>() and \*(T<\fBEASY_COMP_CLEANUP_FN\fR\*(T>(). .PP \*(T<\fBDEFAULT_INIT_COMP\fR\*(T>() just declares the prototypes for the initialisation, destruction and cleanup routines, defines the initialisation status buffer, lock-names list and finally fills the component initialisation structure. Use this when your TLS storage contains not only vector pointers. .PP \*(T<\fBGLOBAL_GET_TLS\fR\*(T>() returns the pointer to the component's \fIthread local storage\fR. .PP \*(T<\fBGLOBAL_SET_ID\fR\*(T>() stores the component identifier, required eg. to access its TLS. .PP \*(T<\fBEASY_COMP_INIT_FN\fR\*(T>() defines a default component initialisation routine. It stores the component identifier and returns with SG_ERROR_NONE. .PP \*(T<\fBEASY_COMP_DESTROY_FN\fR\*(T>() defines a default component destructor, called at the end of the entire process (or when the last \*(T<\fBsg_shutdown\fR\*(T>() is called). The default destructor does nothing and usually an individual initialisation routine requires an individual destructor, too. .PP \*(T<\fBEASY_COMP_CLEANUP_FN\fR\*(T>() defines a default TLS cleanup routine, always called when a thread ends to free vectors held in \fIthread local storage\fR. .PP \*(T<\fBEASY_COMP_ACCESS\fR\*(T>() defines accessors to a specific statistic containing one element provided by the component: the functions \*(T<\fBfn\fR\*(T>() and the \*(T<\fBfn##_r\fR\*(T>(). The following function must exists: 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_vector *\fIname##_vect\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy It accesses the vector idx from TLS of component \*(T and returns sg_##name##_stats. It manages all standard things like memory and error management, return value etc. .PP \*(T<\fBEASY_COMP_DIFF\fR\*(T>() returns the difference between the two statistic collection runs. The variant dealing with statgrab owned statistics return the difference between the content currently in the vector specified by \*(T and the resulting vector of \*(T<\fBgetfn\fR\*(T>(). The result is stored in the vector \*(T. If there is no current result, simply the result of \*(T<\fBgetfn\fR\*(T>() is returned. .PP \*(T<\fBMULTI_COMP_ACCESS\fR\*(T>() defines accessors to a specific statistic containing 0..n elements provided by the component: the functions \*(T<\fBfn\fR\*(T>() and the \*(T<\fBfn##_r\fR\*(T>(). The following function must exists: 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_vector **\fIname##_vect\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy It accesses the vector idx from TLS of component \*(T and returns sg_##name##_stats. It manages all standard things like memory and error anagement, return values, \*(T update, etc. .PP \*(T<\fBMULTI_COMP_DIFF\fR\*(T>() does the same as \*(T<\fBEASY_COMP_DIFF\fR\*(T>() but for vectors with more than one element. .SH "SEE ALSO" \fBlibstatgrab\fR(3) \fBsg_intro\fR(3) \fBsg_set_error\fR(3) \fBsg_comp_init\fR(3) \fBsg_vector_create\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_free_swap_stats.3000644 001750 001750 00000010454 12200045616 023110 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_mem_stats 3 2013-06-17 i-scream "" .SH NAME sg_get_mem_stats, sg_get_mem_stats_r, sg_free_mem_stats, sg_get_swap_stats, sg_get_swap_stats_r, sg_free_swap_stats \- get VM statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_mem_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_swap_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION Memory statistics are accessed through the \*(T<\fBsg_get_mem_stats\fR\*(T>() function and the \*(T<\fBsg_get_mem_stats_r\fR\*(T>() function. Both return a pointer to a \*(T buffer. Note that this statistic doesn't need to map the entire physical memory usage, it represents the real memory usable by the operating system. .PP Memory statistics are accessed through the \*(T<\fBsg_get_swap_stats\fR\*(T>() function and the \*(T<\fBsg_get_swap_stats_r\fR\*(T>() function. Both return a pointer to a \*(T buffer. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_mem_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_mem_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_swap_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_swap_stats_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_mem_stats_r\fR\*(T>() and the \*(T buffer received from \*(T<\fBsg_get_swap_stats_r\fR\*(T>() must be freed using \*(T<\fBsg_free_mem_stats\fR\*(T>() or the \*(T<\fBsg_free_swap_stats\fR\*(T>(), respectively, when not needed any more. The caller is responsible for doing it. .PP On the FreeBSD operating system elevated privileges are required to access the swap statistics. Making the program setgid kmem should be sufficient. Programs running as root will not have this problem. .SH "RETURN VALUES" The VM system calls can return a pointer to either a \*(T or a \*(T. .PP .nf \*(T< typedef struct{ unsigned long long total; unsigned long long free; unsigned long long used; unsigned long long cache; time_t systime; } sg_mem_stats; \*(T> .fi .TP \*(T The total amount of real memory in bytes. .TP \*(T The free amount of real memory in bytes. .TP \*(T The used amount of real memory in bytes. .TP \*(T The amount of real memory in bytes used for caching. .TP \*(T the timestamp when the above stats where collected in seconds since epoch .PP .nf \*(T< typedef struct { unsigned long long total; unsigned long long used; unsigned long long free; time_t systime; } sg_swap_stats; \*(T> .fi .TP \*(T The total swap space in bytes. .TP \*(T The used swap in bytes. .TP \*(T The free swap in bytes. .TP \*(T The timestamp when the above stats where collected in seconds since epoch .SH TODO Add a function to hold open the file descriptor to the kernel memory structures. Doing this would allow the elevated privileges to be dropped early on. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/Makefile.in000644 001750 001750 00000045022 12200045540 021202 0ustar00tdbusers000000 000000 # Makefile.in generated by automake 1.12.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile for libstatgrab/docs/libstatgrab # http://www.i-scream.org/libstatgrab/ # $Id$ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = docs/libstatgrab DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_lib.m4 \ $(top_srcdir)/m4/ax_ncurses.m4 $(top_srcdir)/m4/ax_perl5.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_shellvars.m4 $(top_srcdir)/m4/ax_types.m4 \ $(top_srcdir)/m4/ax_visibility.m4 $(top_srcdir)/m4/ax_win32.m4 \ $(top_srcdir)/m4/ax_xopen.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man3dir = $(mandir)/man3 am__installdirs = "$(DESTDIR)$(man3dir)" NROFF = nroff MANS = $(man_MANS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIN_GROUP = @BIN_GROUP@ BIN_OWNER = @BIN_OWNER@ BIN_PERM = @BIN_PERM@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CLIBFLAGS = @CLIBFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOCBOOK2MAN = @DOCBOOK2MAN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ HAVE_LIBLOG4CPLUS = @HAVE_LIBLOG4CPLUS@ INC_LOG4CPLUS = @INC_LOG4CPLUS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBS_LOG4CPLUS = @LIBS_LOG4CPLUS@ LIBTOOL = @LIBTOOL@ LINKFLAGS = @LINKFLAGS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL5 = @PERL5@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SAIDARCPPFLAGS = @SAIDARCPPFLAGS@ SAIDARLIBS = @SAIDARLIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SG_EXPORT = @SG_EXPORT@ SG_IMPORT = @SG_IMPORT@ SG_PRIVATE = @SG_PRIVATE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_LIBLOG4CPLUS = @WITH_LIBLOG4CPLUS@ WITH_THREADS_CONFIGURED = @WITH_THREADS_CONFIGURED@ WITH_VISIBILITY_SUPPORT = @WITH_VISIBILITY_SUPPORT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log4cplus_CFLAGS = @log4cplus_CFLAGS@ log4cplus_LIBS = @log4cplus_LIBS@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ man_MANS = $(statgrab_MANS) $(sg_cpu_MANS) $(sg_disk_MANS) $(sg_error_MANS) \ $(sg_fs_MANS) $(sg_host_MANS) $(sg_load_MANS) $(sg_mem_MANS) \ $(sg_netif_MANS) $(sg_netio_MANS) $(sg_page_MANS) $(sg_proc_MANS) \ $(sg_user_MANS) $(sg_vect_MANS) $(sg_init_MANS) $(sg_mutex_MANS) \ $(sg_intro_MANS) $(sg_glob_MANS) $(sg_seterr_MANS) statgrab_MANS = statgrab.3 libstatgrab.3 sg_intro_MANS = sg_intro.3 sg_internal-intro.3 sg_cpu_MANS = sg_get_cpu_stats.3 sg_get_cpu_stats_r.3 \ sg_get_cpu_stats_diff.3 sg_get_cpu_stats_diff_between.3 \ sg_get_cpu_percents.3 sg_get_cpu_percents_of.3 \ sg_get_cpu_percents_r.3 sg_free_cpu_stats.3 sg_disk_MANS = sg_get_disk_io_stats.3 sg_get_disk_io_stats_r.3 \ sg_get_disk_io_stats_diff.3 sg_get_disk_io_stats_diff_between.3 \ sg_free_disk_io_stats.3 \ sg_disk_io_compare_name.3 sg_disk_io_compare_traffic.3 sg_error_MANS = sg_get_error.3 sg_get_error_arg.3 sg_get_error_errno.3 \ sg_get_error_details.3 sg_strperror.3 sg_str_error.3 sg_fs_MANS = sg_get_fs_stats.3 sg_get_fs_stats_r.3 \ sg_get_fs_stats_diff.3 sg_get_fs_stats_diff_between.3 \ sg_free_fs_stats.3 \ sg_get_valid_filesystems.3 sg_set_valid_filesystems.3 \ sg_fs_compare_device_name.3 sg_fs_compare_mnt_point.3 sg_host_MANS = sg_get_host_info.3 sg_get_host_info_r.3 sg_free_host_info.3 sg_load_MANS = sg_get_load_stats.3 sg_get_load_stats_r.3 sg_free_load_stats.3 sg_mem_MANS = sg_get_mem_stats.3 sg_get_mem_stats_r.3 sg_free_mem_stats.3 \ sg_get_swap_stats.3 sg_get_swap_stats_r.3 sg_free_swap_stats.3 sg_netif_MANS = sg_get_network_iface_stats.3 sg_get_network_iface_stats_r.3 \ sg_free_network_iface_stats.3 sg_network_iface_compare_name.3 sg_netio_MANS = sg_get_network_io_stats.3 sg_get_network_io_stats_r.3 \ sg_get_network_io_stats_diff.3 sg_get_network_io_stats_diff_between.3 \ sg_free_network_io_stats.3 sg_network_io_compare_name.3 sg_page_MANS = sg_get_page_stats.3 sg_get_page_stats_r.3 \ sg_get_page_stats_diff.3 sg_get_page_stats_diff_between.3 \ sg_free_page_stats.3 sg_proc_MANS = sg_get_process_stats.3 sg_get_process_stats_r.3 \ sg_get_process_count.3 sg_get_process_count_of.3 \ sg_get_process_count_r.3 sg_free_process_count.3 \ sg_process_compare_cpu.3 sg_process_compare_gid.3 \ sg_process_compare_name.3 sg_process_compare_pid.3 \ sg_process_compare_res.3 sg_process_compare_size.3 \ sg_process_compare_time.3 sg_process_compare_uid.3 sg_user_MANS = sg_get_user_stats.3 sg_get_user_stats_r.3 \ sg_free_user_stats.3 sg_vect_MANS = sg_vector_create.3 sg_vector_free.3 \ sg_vector_clear.3 sg_vector_resize.3 \ sg_vector_clone.3 sg_vector_clone_into.3 \ sg_vector_compute_diff.3 \ sg_get_nelements.3 sg_free_stats_buf.3 \ sg_prove_vector.3 sg_init_MANS = sg_init.3 sg_snapshot.3 sg_shutdown.3 sg_drop_privileges.3 sg_mutex_MANS = sg_lock_mutex.3 sg_unlock_mutex.3 sg_glob_MANS = sg_comp_init.3 sg_comp_destroy.3 sg_comp_get_tls.3 \ sg_global_lock.3 sg_global_unlock.3 sg_seterr_MANS = sg_set_error.3 sg_set_error_with_errno.3 sg_clear_error.3 \ sg_set_error_with_errno_code.3 sg_tools_MANS = sg_update_string.3 EXTRA_DIST = $(man_MANS) @BUILD_MANPAGES_TRUE@MAINTAINERCLEANFILES = $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .3 .xml $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign docs/libstatgrab/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign docs/libstatgrab/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man3: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man3dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.3[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \ done; } uninstall-man3: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man3dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.3[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: cscope cscopelist: distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the 'missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically 'make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(DESTDIR)$(man3dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man3 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man3 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man3 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ uninstall uninstall-am uninstall-man uninstall-man3 @BUILD_MANPAGES_TRUE@.xml.3: @BUILD_MANPAGES_TRUE@ $(DOCBOOK2MAN) -N --symlinks --string-param \ @BUILD_MANPAGES_TRUE@ header-3="`git log -1 --format='%ad' --date=short $<`" \ @BUILD_MANPAGES_TRUE@ $< # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libstatgrab-0.90/docs/libstatgrab/sg_comp_get_tls.3000644 001750 001750 00000026613 12200045620 022375 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_comp_init 3 2013-06-07 i-scream "" .SH NAME sg_comp_init, sg_comp_destroy, sg_comp_get_tls, sg_global_lock, sg_global_unlock \- managing system statistics delivery .SH SYNOPSIS 'nh .nf \*(T<#include "tools.h"\*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(unsigned int \fIid\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_comp_init\fR\*(T>() is called by \*(T<\fBsg_init\fR\*(T>() to run the initialisation for the globals component and each registered libstatgrab component. This registration is done statically by appending a component initialisation information structure (instance-of \*(T) to the \*(T list in \*(T<\fIsrc/libstatgrab/globals.c\fR\*(T>. The instance of \*(T is usually defined by using one of \*(T<\fBEASY_COMP_SETUP\fR\*(T>() or \*(T<\fBEXTENDED_COMP_SETUP\fR\*(T>(), respectively. .PP \*(T<\fBsg_comp_destroy\fR\*(T>() is called by \*(T<\fBsg_shutdown\fR\*(T>() to destroy all global resources, eg. translation tables for device names or compiled regular expressions to match path names etc. Statistics resources are managed somewhere else and are freed (conceptually and usually) before \*(T<\fBsg_comp_destroy\fR\*(T>() is invoked. .PP \*(T<\fBsg_comp_get_tls\fR\*(T>() is the internal function to access the thread local storage (formerly static globals) of the component. Usually it's easier to rely on the encapsulating macro \*(T<\fBGLOBAL_GET_TLS\fR\*(T>(). .SH NOTES Delivering system statistics is the job of libstatgrab, managing the delivery is the job of the globals component. To fulfil this job, the components to manage must be prepared: .TP 0.4i 1. declare component's global and TLS data structure (probably only on paper, not in code) .TP 0.4i 2. define global initialisation, thread destruction and process destruction functions (if required by 1.) .TP 0.4i 3. define component information structure using \*(T<\fB*_COMP_SETUP\fR\*(T>() .TP 0.4i 4. define component accessors using one or more of \*(T<\fBEASY_COMP_ACCESS\fR\*(T>() .br \*(T<\fBEASY_COMP_DIFF\fR\*(T>() .br \*(T<\fBMULTI_COMP_ACCESS\fR\*(T>() .br \*(T<\fBMULTI_COMP_DIFF\fR\*(T>() .PP When having done these steps, a new component delivering new statistics is born and needs to be "announced". Assuming the component is named \fIcpu\fR, append the line \*(T<{ &sg_cpu_init, 0 }\*(T> to above named \*(T list. .PP Component initialisation information in detail: .nf \*(T< typedef sg_error (*comp_global_init_function)(unsigned id); typedef void (*comp_global_destroy_function)(void); typedef void (*comp_global_cleanup_function)(void *); struct sg_comp_status { sg_error init_error; }; struct sg_comp_init { comp_global_init_function init_fn; comp_global_destroy_function destroy_fn; comp_global_cleanup_function cleanup_fn; size_t static_buf_size; #if defined(ENABLE_THREADS) && defined(HAVE_PTHREAD) const char **required_locks; #endif struct sg_comp_status *status; }; \*(T> .fi Components which do not need something special can rely on \*(T<\fBEASY_COMP_SETUP\fR\*(T>(): \fBInitialising memory component\fR .PP .nf \*(T< EASY_COMP_SETUP(mem,1,NULL); \*(T> .fi When own initialisation is needed, doing it is a bit more complex: \fBInitialising network component\fR .PP .nf \*(T< #define SG_NETWORK_IO_NOW_IDX 0 #define SG_NETWORK_IO_DIFF_IDX 1 #define SG_NETWORK_IFACE_IDX 2 #define SG_NETWORK_MAX_IDX 3 EXTENDED_COMP_SETUP(network,SG_NETWORK_MAX_IDX,NULL); #ifdef LINUX static regex_t network_io_rx; #define RX_MATCH_COUNT (8+1) #endif sg_error sg_network_init_comp(unsigned id) { GLOBAL_SET_ID(network,id); #ifdef LINUX if( regcomp( &network_io_rx, ..., REG_EXTENDED)!=0) { return sg_set_error(SG_ERROR_PARSE, NULL); } #endif return SG_ERROR_NONE; } void sg_network_destroy_comp(void) { #ifdef LINUX regfree(&network_io_rx); #endif } EASY_COMP_CLEANUP_FN(network,SG_NETWORK_MAX_IDX) \*(T> .fi .SS "MACROS TO WORK WITH THE COMPONENT MANAGER" To simplify working with the component management functions, some preprocessor macros are available. They are shown here as if they were functions to ease understanding. .PP 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, \fI...\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, size_t \fInvect\fR, \fI...\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, size_t \fInvect\fR, \fI...\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, unsigned int \fIid\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, size_t \fInvect\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIfn\fR, identifier \fIcomp\fR, identifier \fIstat\fR, size_t \fIidx\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIfn\fR, identifier \fIcomp\fR, identifier \fIstat\fR, size_t \fIidx\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIfn\fR, identifier \fIgetfn\fR, identifier \fIcomp\fR, identifier \fIstat\fR, size_t \fIdiffidx\fR, size_t \fInowidx\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIfn\fR, identifier \fIgetfn\fR, identifier \fIcomp\fR, identifier \fIstat\fR, size_t \fIdiffidx\fR, size_t \fInowidx\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .PP \*(T<\fBEASY_COMP_SETUP\fR\*(T>() cares about anything to be automatically done for instantiating a component information structure for the specified component \*(T. The created TLS storage structure will hold \*(T pointer elements and that's it. All initialisation, destruction and cleanup-routines are created as needed using \*(T<\fBEASY_COMP_INIT_FN\fR\*(T>(), \*(T<\fBEASY_COMP_DESTROY_FN\fR\*(T>() and \*(T<\fBEASY_COMP_CLEANUP_FN\fR\*(T>(). After the amount of required vector pointers to be stored the list of required mutexes must be specified, finished with a NULL pointer. .PP \*(T<\fBEXTENDED_COMP_SETUP\fR\*(T>() cares about anything to be automatically done for instantiating an component information structure for the specified component \*(T but the required defintion of the initialisation, destruction and cleanup routines. The created TLS storage structure will hold \*(T pointer elements and that's it. After the amount of required vector pointers to be stored, the list of required mutexes must be specified, finished with a NULL pointer. All standard routines can be created semi-automatically using \*(T<\fBEASY_COMP_INIT_FN\fR\*(T>(), \*(T<\fBEASY_COMP_DESTROY_FN\fR\*(T>() and \*(T<\fBEASY_COMP_CLEANUP_FN\fR\*(T>(). .PP \*(T<\fBDEFAULT_INIT_COMP\fR\*(T>() just declares the prototypes for the initialisation, destruction and cleanup routines, defines the initialisation status buffer, lock-names list and finally fills the component initialisation structure. Use this when your TLS storage contains not only vector pointers. .PP \*(T<\fBGLOBAL_GET_TLS\fR\*(T>() returns the pointer to the component's \fIthread local storage\fR. .PP \*(T<\fBGLOBAL_SET_ID\fR\*(T>() stores the component identifier, required eg. to access its TLS. .PP \*(T<\fBEASY_COMP_INIT_FN\fR\*(T>() defines a default component initialisation routine. It stores the component identifier and returns with SG_ERROR_NONE. .PP \*(T<\fBEASY_COMP_DESTROY_FN\fR\*(T>() defines a default component destructor, called at the end of the entire process (or when the last \*(T<\fBsg_shutdown\fR\*(T>() is called). The default destructor does nothing and usually an individual initialisation routine requires an individual destructor, too. .PP \*(T<\fBEASY_COMP_CLEANUP_FN\fR\*(T>() defines a default TLS cleanup routine, always called when a thread ends to free vectors held in \fIthread local storage\fR. .PP \*(T<\fBEASY_COMP_ACCESS\fR\*(T>() defines accessors to a specific statistic containing one element provided by the component: the functions \*(T<\fBfn\fR\*(T>() and the \*(T<\fBfn##_r\fR\*(T>(). The following function must exists: 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_vector *\fIname##_vect\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy It accesses the vector idx from TLS of component \*(T and returns sg_##name##_stats. It manages all standard things like memory and error management, return value etc. .PP \*(T<\fBEASY_COMP_DIFF\fR\*(T>() returns the difference between the two statistic collection runs. The variant dealing with statgrab owned statistics return the difference between the content currently in the vector specified by \*(T and the resulting vector of \*(T<\fBgetfn\fR\*(T>(). The result is stored in the vector \*(T. If there is no current result, simply the result of \*(T<\fBgetfn\fR\*(T>() is returned. .PP \*(T<\fBMULTI_COMP_ACCESS\fR\*(T>() defines accessors to a specific statistic containing 0..n elements provided by the component: the functions \*(T<\fBfn\fR\*(T>() and the \*(T<\fBfn##_r\fR\*(T>(). The following function must exists: 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_vector **\fIname##_vect\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy It accesses the vector idx from TLS of component \*(T and returns sg_##name##_stats. It manages all standard things like memory and error anagement, return values, \*(T update, etc. .PP \*(T<\fBMULTI_COMP_DIFF\fR\*(T>() does the same as \*(T<\fBEASY_COMP_DIFF\fR\*(T>() but for vectors with more than one element. .SH "SEE ALSO" \fBlibstatgrab\fR(3) \fBsg_intro\fR(3) \fBsg_set_error\fR(3) \fBsg_comp_init\fR(3) \fBsg_vector_create\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_error_arg.3000644 001750 001750 00000007477 12200045616 022553 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_error 3 2013-06-07 i-scream "" .SH NAME sg_get_error, sg_get_error_arg, sg_get_error_errno, sg_str_error, sg_get_error_details, sg_strperror \- get last error status .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error_details *\fIerr_details\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error \fIcode\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(char **\fIbuf\fR, const sg_error_details * const \fIerr_details\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION There are four functions to get information about the last occurred error: \*(T<\fBsg_get_error\fR\*(T>, \*(T<\fBsg_get_error_arg\fR\*(T>, \*(T<\fBsg_get_error_errno\fR\*(T> and \*(T<\fBsg_get_error_details\fR\*(T>. The remaining functions are intended to improve the machine-human-interface (e.g. the error log or a message box): \*(T<\fBsg_str_error\fR\*(T> delivers a human readable error name and \*(T<\fBsg_strperror\fR\*(T> prepares a full blown error message for printing. .PP The error argument (\*(T<\fBsg_get_error_arg\fR\*(T>) is stored thread local and is reused every time an error occures. If a later usage is intended, duplicating it is a suitable strategy. Same for the \*(T of \*(T delivered by \*(T<\fBsg_get_error_details\fR\*(T>. .PP When someone calls the function \*(T<\fBsg_get_error_details\fR\*(T> with a NULL pointer, the last error is overridden with a new one describing that \*(T<\fBsg_get_error_details\fR\*(T> is called with invalid arguments. Please be careful. .PP The function \*(T<\fBsg_strperror\fR\*(T> is allowed to be called with or without (\*(T is NULL) collected error details. In the latter case, the last occurred error of this thread is used to prepare the error message. Be aware, the the buffer pointer must be non-NULL (points to an existing \*(T lvalue), but the \*(T lvalue it points to, must be NULL. When invoked correctly, there are only two possible error conditions let \*(T<\fBsg_strperror\fR\*(T> fail: ENOMEM (out of memory) and EINVAL (invalid error code). \fBExample\fR .PP .nf \*(T< if( NULL == sg_get_cpu_stats() ) { char *buf = NULL; if( NULL != sg_strperror( &buf, NULL ) ) { fprintf( stderr, "error getting CPU stats: %s\en", buf ); free(buf); exit(255); } else { fprintf( stderr, "error getting CPU stats and error information\en" ); exit(255); } } \*(T> .fi .SH "RETURN VALUES" The error details contains following information: .PP .nf \*(T< typedef struct sg_error_details { sg_error error; int errno_value; const char *error_arg; } sg_error_details; \*(T> .fi .TP \*(T The statgrab library error code. .TP \*(T The operating system error code. .TP \*(T Additional information set when the error was reported. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_vector_clear.3000644 001750 001750 00000027361 12200045617 022375 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_vector_create 3 2013-06-07 i-scream "" .SH NAME sg_vector_create, sg_vector_clear, sg_vector_resize, sg_vector_free, sg_vector_clone, sg_vector_clone_into, sg_vector_compute_diff, sg_prove_vector, sg_get_nelements, sg_free_stats_buf \- statgrab vector management .SH SYNOPSIS 'nh .nf \*(T<#include "statgrab.h" #include "vector.h"\*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t \fIblock_size\fR, size_t \fIalloc_count\fR, size_t \fIinitial_used\fR, const sg_vector_init_info * const \fIinfo\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const struct sg_vector *\fIsrc\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIdest\fR, const struct sg_vector *\fIsrc\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIdest\fR, const struct sg_vector *\fIcur_vector\fR, const struct sg_vector *\fIlast_vector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const struct sg_vector *\fIvec\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_vector_create\fR\*(T>() allocates and initialises a new statgrab vector with \*(T elements ready for use. Space for \*(T elements is initially allocated (to avoid too many calls to \*(T<\fBrealloc\fR\*(T>() during later \*(T<\fBsg_vector_resize\fR\*(T>() calls). The value of \*(T must be a power of 2, it's rounded up to the next power of 2 when it's not. If \*(T is not a multiple of \*(T, it's rounded up to the next multiple of \*(T. It returns a pointer to the newly created vector. .PP \*(T<\fBsg_vector_clear\fR\*(T>() destroys all elements contained in the given vector. In opposite to \*(T<\fBsg_vector_resize\fR\*(T>( x, 0 ) the allocated size of the vector remains untouched. .PP \*(T<\fBsg_vector_resize\fR\*(T>() increases or decreases the amount of allocated elements in the specified vector. The amount of allocated elements is always a multiple of the intialisation parameter \*(T. In the special case, \*(T<\fBsg_vector_resize\fR\*(T>() is called with 0 in argument \*(T, the vector is freed after all vector elements had been destroyed. It returns the pointer to the resized vector. .PP \*(T<\fBsg_vector_free\fR\*(T>() destroys all vector elements and deallocates the storage belonging to the given vector. .PP \*(T<\fBsg_vector_clone\fR\*(T>() clones all elements of the given vector into a new vector created with the same specification as the referenced one. It returns a pointer to the cloned vector. .PP \*(T<\fBsg_vector_clone_into\fR\*(T>() clones all elements of the given source vector into the given target vector. The target vector must be created for the same element data type as the source vector. It returns an error code != to SG_ERROR_NONE if something went wrong. .PP \*(T<\fBsg_vector_compute_diff\fR\*(T>() computes a difference vector between the vector containing current statistics and another vector containing older statistics. If an element exists in the current vector but not in the opposite one, it's cloned into the result vector. If an element exists only in the opposite vector, it doesn't appear in the target vector. \*(T<\fBsg_vector_compute_diff\fR\*(T>() returns an error code != to SG_ERROR_NONE if something went wrong. .PP \*(T<\fBsg_prove_vector\fR\*(T>() proves whether a pointer to a vector really points to a vector. In case the given vector pointer points to corrupted data, the program is aborted. When \*(T<\fBsg_prove_vector\fR\*(T>() returns, it returns SG_ERROR_NONE. .PP \*(T<\fBsg_get_nelements\fR\*(T>() returns the number of elements the given data area, encompasses by a statgrab vector, contains. The vector head is internally calculated from the given pointer to the first vector element. .PP \*(T<\fBsg_free_stats_buf\fR\*(T>() frees the vector emcompassing the given data area. .SH NOTES Except \*(T<\fBsg_get_nelements\fR\*(T>() and \*(T<\fBsg_free_stats_buf\fR\*(T>() none of above functions can be called from outside of the libstatgrab sources. The documented structures and APIs may change without warning. The description of all other API is intended to be read from libstatgrab developers only. .PP Each vector is created from two elements: the vector information and the list of elements: .nf \*(T< template struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; Impl vector_implementation; T elements[alloc_count]; }; \*(T> .fi Of course, it is not valid C, so being tricky was the solution: .nf \*(T< typedef struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; struct sg_vector_init_info info; } sg_vector; struct sg_vector_size_helper { struct sg_vector v; long long ll; }; #define VECTOR_SIZE offsetof(struct sg_vector_size_helper,ll) /* Return the data ptr of a vector */ #define VECTOR_DATA(vector) \e (vector ? (void *)(((char *)vector)+VECTOR_SIZE) : NULL) #define VECTOR_ADDR_ARITH(ptr) \e (sg_vector *)(((char *)(ptr))\-VECTOR_SIZE) /* Return the vector for a data */ #define VECTOR_ADDRESS(ptr) \e ((ptr) ? (SG_ERROR_NONE == sg_prove_vector(VECTOR_ADDR_ARITH(ptr)) ? VECTOR_ADDR_ARITH(ptr) : NULL ) : NULL) \*(T> .fi .PP This also allows user functions as \*(T<\fBsg_get_nelements\fR\*(T>() and \*(T<\fBsg_free_stats_buf\fR\*(T>() to switch easily between the vector structure and the content. .SS "THE VECTOR SPECIALISATION STRUCTURE" As mentioned, the vector implementation uses strategies from the object oriented programming concept named "polymorphism". A vector is described by a small object containing inherent attributes like element size and a bunch of "virtual methods" to do element related tasks like initialising or destroying elements. .PP .nf \*(T< typedef void (*vector_init_function)(void *item); typedef sg_error (*vector_copy_function)(const void *src, void *dst); typedef sg_error (*vector_compute_diff_function)(void *dst, const void *src); typedef int (*vector_compare_function)(const void *a, const void *b); typedef void (*vector_destroy_function)(void *item); struct sg_vector_init_info { size_t item_size; vector_init_function init_fn; vector_copy_function copy_fn; vector_compute_diff_function compute_diff_fn; vector_compare_function compare_fn; vector_destroy_function destroy_fn; }; \*(T> .fi .PP The instances of struct \*(T are conceptional statically initialised by using either the preprocessor macro \*(T<\fBVECTOR_INIT_INFO_FULL_INIT\fR\*(T>(\*(T) or \*(T<\fBVECTOR_INIT_INFO_EMPTY_INIT\fR\*(T>(\*(T). Here're some examples to demonstrate how it's meant: \fBInitialising CPU statistics vector description\fR .PP .nf \*(T< VECTOR_INIT_INFO_EMPTY_INIT(sg_cpu_stats); \*(T> .fi .PP \fBInitialising Host-Info statistics vector description\fR .PP .nf \*(T< static void sg_os_stats_item_init(sg_os_stats *d); static void sg_os_stats_item_destroy(sg_os_stats *d); #define sg_os_stats_item_copy NULL #define sg_os_stats_item_compute_diff NULL #define sg_os_stats_item_compare NULL VECTOR_INIT_INFO_FULL_INIT(sg_os_stats); \*(T> .fi .PP \fBInitialising Disk-IO statistics vector description\fR .PP .nf \*(T< static void sg_disk_io_stats_item_init(sg_disk_io_stats *d); static sg_error sg_disk_io_stats_item_copy(sg_disk_io_stats *d, const sg_disk_io_stats *s); static sg_error sg_disk_io_stats_item_compute_diff(const sg_disk_io_stats *s, sg_disk_io_stats *d); static int sg_disk_io_stats_item_compare(const sg_disk_io_stats *a, const sg_disk_io_stats *b); static void sg_disk_io_stats_item_destroy(sg_disk_io_stats *d); VECTOR_INIT_INFO_FULL_INIT(sg_disk_io_stats); \*(T> .fi .SS "WORKING WITH VECTORS" To simplify the working with the vector management functions, some preprocessor macros are available. They are shown here as if they were functions to ease understanding. .PP 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fItype\fR, size_t \fIblock_size\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR, size_t \fInew_count\fR, identifier \fItype\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIvectorptr\fR, size_t \fInew_count\fR, datatype *\fIdata\fR, identifier \fIdatatype\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .PP \*(T<\fBVECTOR_CREATE\fR\*(T>() calls \*(T<\fBsg_vector_create\fR\*(T>() with \*(T and \*(T using the vector specialisation \*(T. .PP \*(T<\fBVECTOR_CLEAR\fR\*(T>() simply calls \*(T<\fBsg_vector_clear\fR\*(T>(). This macro exists only for conformity. .PP \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() calls \*(T<\fBsg_vector_create\fR\*(T>() when the given vector pointer points to \*(T or \*(T<\fBsg_vector_resize\fR\*(T>() otherwise. The result of the appropriate function is returned. .PP \*(T<\fBVECTOR_UPDATE\fR\*(T>() calls \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() and sets data to the first element of the resulting vector when a non-NULL pointer got, to NULL otherwise. When \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() returns a NULL pointer and \*(T is not equal to 0 (zero), the intructions from the macro \*(T<\fBVECTOR_UPDATE_ERROR_CLEANUP\fR\*(T> are executed to cleanup before returning from current subroutine with the error which has been occurred. .PP \*(T<\fBVECTOR_ITEM_COUNT\fR\*(T>() returns 0 for a non-existing vector (\*(T == 0) and the number of containing elements otherwise. .SH "RETURN VALUES" Beside error codes, the return values, if any, are always a pointer to vector structures (struct \*(T *). .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_comp_init.3000644 001750 001750 00000026613 12200045620 021677 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_comp_init 3 2013-06-07 i-scream "" .SH NAME sg_comp_init, sg_comp_destroy, sg_comp_get_tls, sg_global_lock, sg_global_unlock \- managing system statistics delivery .SH SYNOPSIS 'nh .nf \*(T<#include "tools.h"\*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(unsigned int \fIid\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_comp_init\fR\*(T>() is called by \*(T<\fBsg_init\fR\*(T>() to run the initialisation for the globals component and each registered libstatgrab component. This registration is done statically by appending a component initialisation information structure (instance-of \*(T) to the \*(T list in \*(T<\fIsrc/libstatgrab/globals.c\fR\*(T>. The instance of \*(T is usually defined by using one of \*(T<\fBEASY_COMP_SETUP\fR\*(T>() or \*(T<\fBEXTENDED_COMP_SETUP\fR\*(T>(), respectively. .PP \*(T<\fBsg_comp_destroy\fR\*(T>() is called by \*(T<\fBsg_shutdown\fR\*(T>() to destroy all global resources, eg. translation tables for device names or compiled regular expressions to match path names etc. Statistics resources are managed somewhere else and are freed (conceptually and usually) before \*(T<\fBsg_comp_destroy\fR\*(T>() is invoked. .PP \*(T<\fBsg_comp_get_tls\fR\*(T>() is the internal function to access the thread local storage (formerly static globals) of the component. Usually it's easier to rely on the encapsulating macro \*(T<\fBGLOBAL_GET_TLS\fR\*(T>(). .SH NOTES Delivering system statistics is the job of libstatgrab, managing the delivery is the job of the globals component. To fulfil this job, the components to manage must be prepared: .TP 0.4i 1. declare component's global and TLS data structure (probably only on paper, not in code) .TP 0.4i 2. define global initialisation, thread destruction and process destruction functions (if required by 1.) .TP 0.4i 3. define component information structure using \*(T<\fB*_COMP_SETUP\fR\*(T>() .TP 0.4i 4. define component accessors using one or more of \*(T<\fBEASY_COMP_ACCESS\fR\*(T>() .br \*(T<\fBEASY_COMP_DIFF\fR\*(T>() .br \*(T<\fBMULTI_COMP_ACCESS\fR\*(T>() .br \*(T<\fBMULTI_COMP_DIFF\fR\*(T>() .PP When having done these steps, a new component delivering new statistics is born and needs to be "announced". Assuming the component is named \fIcpu\fR, append the line \*(T<{ &sg_cpu_init, 0 }\*(T> to above named \*(T list. .PP Component initialisation information in detail: .nf \*(T< typedef sg_error (*comp_global_init_function)(unsigned id); typedef void (*comp_global_destroy_function)(void); typedef void (*comp_global_cleanup_function)(void *); struct sg_comp_status { sg_error init_error; }; struct sg_comp_init { comp_global_init_function init_fn; comp_global_destroy_function destroy_fn; comp_global_cleanup_function cleanup_fn; size_t static_buf_size; #if defined(ENABLE_THREADS) && defined(HAVE_PTHREAD) const char **required_locks; #endif struct sg_comp_status *status; }; \*(T> .fi Components which do not need something special can rely on \*(T<\fBEASY_COMP_SETUP\fR\*(T>(): \fBInitialising memory component\fR .PP .nf \*(T< EASY_COMP_SETUP(mem,1,NULL); \*(T> .fi When own initialisation is needed, doing it is a bit more complex: \fBInitialising network component\fR .PP .nf \*(T< #define SG_NETWORK_IO_NOW_IDX 0 #define SG_NETWORK_IO_DIFF_IDX 1 #define SG_NETWORK_IFACE_IDX 2 #define SG_NETWORK_MAX_IDX 3 EXTENDED_COMP_SETUP(network,SG_NETWORK_MAX_IDX,NULL); #ifdef LINUX static regex_t network_io_rx; #define RX_MATCH_COUNT (8+1) #endif sg_error sg_network_init_comp(unsigned id) { GLOBAL_SET_ID(network,id); #ifdef LINUX if( regcomp( &network_io_rx, ..., REG_EXTENDED)!=0) { return sg_set_error(SG_ERROR_PARSE, NULL); } #endif return SG_ERROR_NONE; } void sg_network_destroy_comp(void) { #ifdef LINUX regfree(&network_io_rx); #endif } EASY_COMP_CLEANUP_FN(network,SG_NETWORK_MAX_IDX) \*(T> .fi .SS "MACROS TO WORK WITH THE COMPONENT MANAGER" To simplify working with the component management functions, some preprocessor macros are available. They are shown here as if they were functions to ease understanding. .PP 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, \fI...\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, size_t \fInvect\fR, \fI...\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, size_t \fInvect\fR, \fI...\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, unsigned int \fIid\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIcomp\fR, size_t \fInvect\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIfn\fR, identifier \fIcomp\fR, identifier \fIstat\fR, size_t \fIidx\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIfn\fR, identifier \fIcomp\fR, identifier \fIstat\fR, size_t \fIidx\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIfn\fR, identifier \fIgetfn\fR, identifier \fIcomp\fR, identifier \fIstat\fR, size_t \fIdiffidx\fR, size_t \fInowidx\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fIfn\fR, identifier \fIgetfn\fR, identifier \fIcomp\fR, identifier \fIstat\fR, size_t \fIdiffidx\fR, size_t \fInowidx\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .PP \*(T<\fBEASY_COMP_SETUP\fR\*(T>() cares about anything to be automatically done for instantiating a component information structure for the specified component \*(T. The created TLS storage structure will hold \*(T pointer elements and that's it. All initialisation, destruction and cleanup-routines are created as needed using \*(T<\fBEASY_COMP_INIT_FN\fR\*(T>(), \*(T<\fBEASY_COMP_DESTROY_FN\fR\*(T>() and \*(T<\fBEASY_COMP_CLEANUP_FN\fR\*(T>(). After the amount of required vector pointers to be stored the list of required mutexes must be specified, finished with a NULL pointer. .PP \*(T<\fBEXTENDED_COMP_SETUP\fR\*(T>() cares about anything to be automatically done for instantiating an component information structure for the specified component \*(T but the required defintion of the initialisation, destruction and cleanup routines. The created TLS storage structure will hold \*(T pointer elements and that's it. After the amount of required vector pointers to be stored, the list of required mutexes must be specified, finished with a NULL pointer. All standard routines can be created semi-automatically using \*(T<\fBEASY_COMP_INIT_FN\fR\*(T>(), \*(T<\fBEASY_COMP_DESTROY_FN\fR\*(T>() and \*(T<\fBEASY_COMP_CLEANUP_FN\fR\*(T>(). .PP \*(T<\fBDEFAULT_INIT_COMP\fR\*(T>() just declares the prototypes for the initialisation, destruction and cleanup routines, defines the initialisation status buffer, lock-names list and finally fills the component initialisation structure. Use this when your TLS storage contains not only vector pointers. .PP \*(T<\fBGLOBAL_GET_TLS\fR\*(T>() returns the pointer to the component's \fIthread local storage\fR. .PP \*(T<\fBGLOBAL_SET_ID\fR\*(T>() stores the component identifier, required eg. to access its TLS. .PP \*(T<\fBEASY_COMP_INIT_FN\fR\*(T>() defines a default component initialisation routine. It stores the component identifier and returns with SG_ERROR_NONE. .PP \*(T<\fBEASY_COMP_DESTROY_FN\fR\*(T>() defines a default component destructor, called at the end of the entire process (or when the last \*(T<\fBsg_shutdown\fR\*(T>() is called). The default destructor does nothing and usually an individual initialisation routine requires an individual destructor, too. .PP \*(T<\fBEASY_COMP_CLEANUP_FN\fR\*(T>() defines a default TLS cleanup routine, always called when a thread ends to free vectors held in \fIthread local storage\fR. .PP \*(T<\fBEASY_COMP_ACCESS\fR\*(T>() defines accessors to a specific statistic containing one element provided by the component: the functions \*(T<\fBfn\fR\*(T>() and the \*(T<\fBfn##_r\fR\*(T>(). The following function must exists: 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_vector *\fIname##_vect\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy It accesses the vector idx from TLS of component \*(T and returns sg_##name##_stats. It manages all standard things like memory and error management, return value etc. .PP \*(T<\fBEASY_COMP_DIFF\fR\*(T>() returns the difference between the two statistic collection runs. The variant dealing with statgrab owned statistics return the difference between the content currently in the vector specified by \*(T and the resulting vector of \*(T<\fBgetfn\fR\*(T>(). The result is stored in the vector \*(T. If there is no current result, simply the result of \*(T<\fBgetfn\fR\*(T>() is returned. .PP \*(T<\fBMULTI_COMP_ACCESS\fR\*(T>() defines accessors to a specific statistic containing 0..n elements provided by the component: the functions \*(T<\fBfn\fR\*(T>() and the \*(T<\fBfn##_r\fR\*(T>(). The following function must exists: 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_vector **\fIname##_vect\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy It accesses the vector idx from TLS of component \*(T and returns sg_##name##_stats. It manages all standard things like memory and error anagement, return values, \*(T update, etc. .PP \*(T<\fBMULTI_COMP_DIFF\fR\*(T>() does the same as \*(T<\fBEASY_COMP_DIFF\fR\*(T>() but for vectors with more than one element. .SH "SEE ALSO" \fBlibstatgrab\fR(3) \fBsg_intro\fR(3) \fBsg_set_error\fR(3) \fBsg_comp_init\fR(3) \fBsg_vector_create\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_free_page_stats.3000644 001750 001750 00000006764 12200045617 023064 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_page_stats 3 2013-06-17 i-scream "" .SH NAME sg_get_page_stats, sg_get_page_stats_r, sg_get_page_stats_diff, sg_get_page_stats_diff_between, sg_free_page_stats \- get paging statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_page_stats *\fIcur\fR, const sg_page_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_page_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The page stats module deliver the number of pages swapped in and out, either since the machine has been booted (by the \*(T<\fBsg_get_page_stats\fR\*(T>() and \*(T<\fBsg_get_page_stats_r\fR\*(T>() functions) or the difference between two measured statistics (by the \*(T<\fBsg_get_page_stats_diff\fR\*(T>() and \*(T<\fBsg_get_page_stats_diff_between\fR\*(T>() functions). .PP The \*(T<\fBsg_get_page_stats_diff\fR\*(T>() function calculates the difference between the last call to the function \*(T<\fBsg_get_page_stats\fR\*(T>() in this thread (the statistics of the earlier call are saved and \*(T<\fBsg_get_page_stats\fR\*(T>() is called immediately after this). .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_page_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_page_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_page_stats_diff T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_page_stats_diff_between T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_page_stats_r\fR\*(T>() and the \*(T<\fBsg_get_page_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_page_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .SH "RETURN VALUES" .nf \*(T< typedef struct{ unsigned long long pages_pagein; unsigned long long pages_pageout; time_t systime; }sg_page_stats; \*(T> .fi .TP \*(T The number of pages swapped into memory. .TP \*(T The number of pages swapped out of memory (to swap). .TP \*(T The timestamp when the above stats where collected in seconds since epoch or the time period over which \*(T and \*(T were transferred. .SH BUGS Solaris doesn't seem to report accurately. It reports the number of pages swapped into memory, not necessarily from swap. This feature isn't deemed entirely reliable. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_user_stats.3000644 001750 001750 00000005607 12200045617 022757 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_user_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_user_stats, sg_get_user_stats_r, sg_free_user_stats \- get the current logged in users .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_user_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The user statistics module delivers some information about logged on users. Each logon is treated separately. Both statistic get functions, \*(T<\fBsg_get_user_stats\fR\*(T>() and \*(T<\fBsg_get_user_stats_r\fR\*(T>(), return a vector of \*(T with \*(T elements. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l l | l | l. T{ sg_get_user_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_user_stats_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T vector received from \*(T<\fBsg_get_user_stats_r\fR\*(T>() must be freed using \*(T<\fBsg_free_user_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .SH "RETURN VALUES" The structure returned is of type \*(T. .PP .nf \*(T< typedef struct { char *login_name; char *record_id; size_t record_id_size; char *device; char *hostname; pid_t pid; time_t login_time; time_t systime; } sg_user_stats; \*(T> .fi .TP \*(T The username which was used to log in .TP \*(T Record identifier of host database containing login information (not necessarily 0-terminated) .TP \*(T Size of the record identifier .TP \*(T Device name (eg. "pts/0") of the tty assigned to the login session .TP \*(T (remote) Hostname from where the user is logged on, eg. "infoterm7.some.kind.of.domain.local", "localhost", "10.42.17.4" or ":0.0" (in case it's a local logon via new xterm) .TP \*(T Process identifier of the process which made the entry to the logged on users database .TP \*(T Timestamp (time in seconds since epoch) when the user logged on .TP \*(T The timestamp when the above stats where collected in seconds since epoch .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/libstatgrab.3000644 001750 001750 00000033363 12200045616 021530 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH libstatgrab 3 2013-06-07 i-scream "" .SH NAME statgrab, libstatgrab \- get system statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(int \fIignore_init_errors\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error \fIcode\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error_details *\fIerr_details\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(char **\fIbuf\fR, const sg_error_details * const \fIerr_details\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const char *\fImutex_name\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const char *\fImutex_name\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_percent_source \fIcps\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_cpu_stats *\fIwhereof\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_percents *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_cpu_stats *\fIcpu_now\fR, const sg_cpu_stats *\fIcpu_last\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_disk_io_stats *\fIcur\fR, const sg_disk_io_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_disk_io_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_fs_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const char *\fIvalid_fs\fR[]);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_host_info *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_load_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_mem_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_swap_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_network_iface_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_network_io_stats *\fIcur\fR, const sg_network_io_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_network_iface_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_page_stats *\fIcur\fR, const sg_page_stats *\fIlast\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_page_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count_source \fIpcs\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_stats const *\fIwhereof\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_process_count *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_user_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The statgrab library provides a cross-platform interface to get several system statistics. System statistics aren't standardised, so the statgrab library tries to choose the most important values over all supported operating systems. This implies that some values might not be available on every OS while some specific values are missing when there are no counterparts on any other OS. .PP The libstatgrab is organised in components, each for interrelated statistics. .TS allbox ; l | l. T{ component T} T{ statistics T} .T& l | l. T{ cpu T} T{ \*(T, \*(T T} T{ disk T} T{ \*(T, \*(T T} T{ load T} T{ \*(T T} T{ mem T} T{ \*(T T} T{ network T} T{ \*(T, \*(T T} T{ os T} T{ \*(T T} T{ page T} T{ \*(T T} T{ process T} T{ \*(T, \*(T T} T{ swap T} T{ \*(T T} T{ user T} T{ \*(T T} .TE .PP The library was originally written to support the i-scream central monitoring system, but has since become a standalone package. It has been ported to work on Linux, NetBSD, FreeBSD, OpenBSD, DragonFly BSD, Solaris, HP-UX, AIX and Cygwin. .SH "SEE ALSO" \fBsg_intro\fR(3) \fBsg_get_cpu_stats\fR(3) \fBsg_get_disk_io_stats\fR(3) \fBsg_get_fs_stats\fR(3) \fBsg_get_host_info\fR(3) \fBsg_get_load_stats\fR(3) \fBsg_get_mem_stats\fR(3) \fBsg_get_network_io_stats\fR(3) \fBsg_get_network_iface_stats\fR(3) \fBsg_get_page_stats\fR(3) \fBsg_get_process_stats\fR(3) \fBsg_get_swap_stats\fR(3) \fBsg_get_user_stats\fR(3) \fBsg_get_error\fR(3) \fBsg_internal-intro\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_error_details.3000644 001750 001750 00000007477 12200045616 023427 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_error 3 2013-06-07 i-scream "" .SH NAME sg_get_error, sg_get_error_arg, sg_get_error_errno, sg_str_error, sg_get_error_details, sg_strperror \- get last error status .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error_details *\fIerr_details\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_error \fIcode\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(char **\fIbuf\fR, const sg_error_details * const \fIerr_details\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION There are four functions to get information about the last occurred error: \*(T<\fBsg_get_error\fR\*(T>, \*(T<\fBsg_get_error_arg\fR\*(T>, \*(T<\fBsg_get_error_errno\fR\*(T> and \*(T<\fBsg_get_error_details\fR\*(T>. The remaining functions are intended to improve the machine-human-interface (e.g. the error log or a message box): \*(T<\fBsg_str_error\fR\*(T> delivers a human readable error name and \*(T<\fBsg_strperror\fR\*(T> prepares a full blown error message for printing. .PP The error argument (\*(T<\fBsg_get_error_arg\fR\*(T>) is stored thread local and is reused every time an error occures. If a later usage is intended, duplicating it is a suitable strategy. Same for the \*(T of \*(T delivered by \*(T<\fBsg_get_error_details\fR\*(T>. .PP When someone calls the function \*(T<\fBsg_get_error_details\fR\*(T> with a NULL pointer, the last error is overridden with a new one describing that \*(T<\fBsg_get_error_details\fR\*(T> is called with invalid arguments. Please be careful. .PP The function \*(T<\fBsg_strperror\fR\*(T> is allowed to be called with or without (\*(T is NULL) collected error details. In the latter case, the last occurred error of this thread is used to prepare the error message. Be aware, the the buffer pointer must be non-NULL (points to an existing \*(T lvalue), but the \*(T lvalue it points to, must be NULL. When invoked correctly, there are only two possible error conditions let \*(T<\fBsg_strperror\fR\*(T> fail: ENOMEM (out of memory) and EINVAL (invalid error code). \fBExample\fR .PP .nf \*(T< if( NULL == sg_get_cpu_stats() ) { char *buf = NULL; if( NULL != sg_strperror( &buf, NULL ) ) { fprintf( stderr, "error getting CPU stats: %s\en", buf ); free(buf); exit(255); } else { fprintf( stderr, "error getting CPU stats and error information\en" ); exit(255); } } \*(T> .fi .SH "RETURN VALUES" The error details contains following information: .PP .nf \*(T< typedef struct sg_error_details { sg_error error; int errno_value; const char *error_arg; } sg_error_details; \*(T> .fi .TP \*(T The statgrab library error code. .TP \*(T The operating system error code. .TP \*(T Additional information set when the error was reported. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_prove_vector.3000644 001750 001750 00000027361 12200045617 022442 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_vector_create 3 2013-06-07 i-scream "" .SH NAME sg_vector_create, sg_vector_clear, sg_vector_resize, sg_vector_free, sg_vector_clone, sg_vector_clone_into, sg_vector_compute_diff, sg_prove_vector, sg_get_nelements, sg_free_stats_buf \- statgrab vector management .SH SYNOPSIS 'nh .nf \*(T<#include "statgrab.h" #include "vector.h"\*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t \fIblock_size\fR, size_t \fIalloc_count\fR, size_t \fIinitial_used\fR, const sg_vector_init_info * const \fIinfo\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const struct sg_vector *\fIsrc\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIdest\fR, const struct sg_vector *\fIsrc\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIdest\fR, const struct sg_vector *\fIcur_vector\fR, const struct sg_vector *\fIlast_vector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const struct sg_vector *\fIvec\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(void *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \*(T<\fBsg_vector_create\fR\*(T>() allocates and initialises a new statgrab vector with \*(T elements ready for use. Space for \*(T elements is initially allocated (to avoid too many calls to \*(T<\fBrealloc\fR\*(T>() during later \*(T<\fBsg_vector_resize\fR\*(T>() calls). The value of \*(T must be a power of 2, it's rounded up to the next power of 2 when it's not. If \*(T is not a multiple of \*(T, it's rounded up to the next multiple of \*(T. It returns a pointer to the newly created vector. .PP \*(T<\fBsg_vector_clear\fR\*(T>() destroys all elements contained in the given vector. In opposite to \*(T<\fBsg_vector_resize\fR\*(T>( x, 0 ) the allocated size of the vector remains untouched. .PP \*(T<\fBsg_vector_resize\fR\*(T>() increases or decreases the amount of allocated elements in the specified vector. The amount of allocated elements is always a multiple of the intialisation parameter \*(T. In the special case, \*(T<\fBsg_vector_resize\fR\*(T>() is called with 0 in argument \*(T, the vector is freed after all vector elements had been destroyed. It returns the pointer to the resized vector. .PP \*(T<\fBsg_vector_free\fR\*(T>() destroys all vector elements and deallocates the storage belonging to the given vector. .PP \*(T<\fBsg_vector_clone\fR\*(T>() clones all elements of the given vector into a new vector created with the same specification as the referenced one. It returns a pointer to the cloned vector. .PP \*(T<\fBsg_vector_clone_into\fR\*(T>() clones all elements of the given source vector into the given target vector. The target vector must be created for the same element data type as the source vector. It returns an error code != to SG_ERROR_NONE if something went wrong. .PP \*(T<\fBsg_vector_compute_diff\fR\*(T>() computes a difference vector between the vector containing current statistics and another vector containing older statistics. If an element exists in the current vector but not in the opposite one, it's cloned into the result vector. If an element exists only in the opposite vector, it doesn't appear in the target vector. \*(T<\fBsg_vector_compute_diff\fR\*(T>() returns an error code != to SG_ERROR_NONE if something went wrong. .PP \*(T<\fBsg_prove_vector\fR\*(T>() proves whether a pointer to a vector really points to a vector. In case the given vector pointer points to corrupted data, the program is aborted. When \*(T<\fBsg_prove_vector\fR\*(T>() returns, it returns SG_ERROR_NONE. .PP \*(T<\fBsg_get_nelements\fR\*(T>() returns the number of elements the given data area, encompasses by a statgrab vector, contains. The vector head is internally calculated from the given pointer to the first vector element. .PP \*(T<\fBsg_free_stats_buf\fR\*(T>() frees the vector emcompassing the given data area. .SH NOTES Except \*(T<\fBsg_get_nelements\fR\*(T>() and \*(T<\fBsg_free_stats_buf\fR\*(T>() none of above functions can be called from outside of the libstatgrab sources. The documented structures and APIs may change without warning. The description of all other API is intended to be read from libstatgrab developers only. .PP Each vector is created from two elements: the vector information and the list of elements: .nf \*(T< template struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; Impl vector_implementation; T elements[alloc_count]; }; \*(T> .fi Of course, it is not valid C, so being tricky was the solution: .nf \*(T< typedef struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; struct sg_vector_init_info info; } sg_vector; struct sg_vector_size_helper { struct sg_vector v; long long ll; }; #define VECTOR_SIZE offsetof(struct sg_vector_size_helper,ll) /* Return the data ptr of a vector */ #define VECTOR_DATA(vector) \e (vector ? (void *)(((char *)vector)+VECTOR_SIZE) : NULL) #define VECTOR_ADDR_ARITH(ptr) \e (sg_vector *)(((char *)(ptr))\-VECTOR_SIZE) /* Return the vector for a data */ #define VECTOR_ADDRESS(ptr) \e ((ptr) ? (SG_ERROR_NONE == sg_prove_vector(VECTOR_ADDR_ARITH(ptr)) ? VECTOR_ADDR_ARITH(ptr) : NULL ) : NULL) \*(T> .fi .PP This also allows user functions as \*(T<\fBsg_get_nelements\fR\*(T>() and \*(T<\fBsg_free_stats_buf\fR\*(T>() to switch easily between the vector structure and the content. .SS "THE VECTOR SPECIALISATION STRUCTURE" As mentioned, the vector implementation uses strategies from the object oriented programming concept named "polymorphism". A vector is described by a small object containing inherent attributes like element size and a bunch of "virtual methods" to do element related tasks like initialising or destroying elements. .PP .nf \*(T< typedef void (*vector_init_function)(void *item); typedef sg_error (*vector_copy_function)(const void *src, void *dst); typedef sg_error (*vector_compute_diff_function)(void *dst, const void *src); typedef int (*vector_compare_function)(const void *a, const void *b); typedef void (*vector_destroy_function)(void *item); struct sg_vector_init_info { size_t item_size; vector_init_function init_fn; vector_copy_function copy_fn; vector_compute_diff_function compute_diff_fn; vector_compare_function compare_fn; vector_destroy_function destroy_fn; }; \*(T> .fi .PP The instances of struct \*(T are conceptional statically initialised by using either the preprocessor macro \*(T<\fBVECTOR_INIT_INFO_FULL_INIT\fR\*(T>(\*(T) or \*(T<\fBVECTOR_INIT_INFO_EMPTY_INIT\fR\*(T>(\*(T). Here're some examples to demonstrate how it's meant: \fBInitialising CPU statistics vector description\fR .PP .nf \*(T< VECTOR_INIT_INFO_EMPTY_INIT(sg_cpu_stats); \*(T> .fi .PP \fBInitialising Host-Info statistics vector description\fR .PP .nf \*(T< static void sg_os_stats_item_init(sg_os_stats *d); static void sg_os_stats_item_destroy(sg_os_stats *d); #define sg_os_stats_item_copy NULL #define sg_os_stats_item_compute_diff NULL #define sg_os_stats_item_compare NULL VECTOR_INIT_INFO_FULL_INIT(sg_os_stats); \*(T> .fi .PP \fBInitialising Disk-IO statistics vector description\fR .PP .nf \*(T< static void sg_disk_io_stats_item_init(sg_disk_io_stats *d); static sg_error sg_disk_io_stats_item_copy(sg_disk_io_stats *d, const sg_disk_io_stats *s); static sg_error sg_disk_io_stats_item_compute_diff(const sg_disk_io_stats *s, sg_disk_io_stats *d); static int sg_disk_io_stats_item_compare(const sg_disk_io_stats *a, const sg_disk_io_stats *b); static void sg_disk_io_stats_item_destroy(sg_disk_io_stats *d); VECTOR_INIT_INFO_FULL_INIT(sg_disk_io_stats); \*(T> .fi .SS "WORKING WITH VECTORS" To simplify the working with the vector management functions, some preprocessor macros are available. They are shown here as if they were functions to ease understanding. .PP 'nh .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(identifier \fItype\fR, size_t \fIblock_size\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR, size_t \fInew_count\fR, identifier \fItype\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector **\fIvectorptr\fR, size_t \fInew_count\fR, datatype *\fIdata\fR, identifier \fIdatatype\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(struct sg_vector *\fIvector\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .PP \*(T<\fBVECTOR_CREATE\fR\*(T>() calls \*(T<\fBsg_vector_create\fR\*(T>() with \*(T and \*(T using the vector specialisation \*(T. .PP \*(T<\fBVECTOR_CLEAR\fR\*(T>() simply calls \*(T<\fBsg_vector_clear\fR\*(T>(). This macro exists only for conformity. .PP \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() calls \*(T<\fBsg_vector_create\fR\*(T>() when the given vector pointer points to \*(T or \*(T<\fBsg_vector_resize\fR\*(T>() otherwise. The result of the appropriate function is returned. .PP \*(T<\fBVECTOR_UPDATE\fR\*(T>() calls \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() and sets data to the first element of the resulting vector when a non-NULL pointer got, to NULL otherwise. When \*(T<\fBVECTOR_CREATE_OR_RESIZE\fR\*(T>() returns a NULL pointer and \*(T is not equal to 0 (zero), the intructions from the macro \*(T<\fBVECTOR_UPDATE_ERROR_CLEANUP\fR\*(T> are executed to cleanup before returning from current subroutine with the error which has been occurred. .PP \*(T<\fBVECTOR_ITEM_COUNT\fR\*(T>() returns 0 for a non-existing vector (\*(T == 0) and the number of containing elements otherwise. .SH "RETURN VALUES" Beside error codes, the return values, if any, are always a pointer to vector structures (struct \*(T *). .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_cpu_percents.3000644 001750 001750 00000013052 12200045616 023245 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_cpu_stats 3 2013-06-17 i-scream "" .SH NAME sg_get_cpu_stats, sg_get_cpu_stats_r, sg_get_cpu_stats_diff, sg_get_cpu_stats_diff_between, sg_get_cpu_percents, sg_get_cpu_percents_of, sg_get_cpu_percents_r, sg_free_cpu_stats \- get cpu usage .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_percent_source \fIcps\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_cpu_stats *\fIwhereof\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_percents *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_cpu_stats *\fIcpu_now\fR, const sg_cpu_stats *\fIcpu_last\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_cpu_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION These are the categories of data delivered by the cpu stats module: \*(T<\fBsg_get_cpu_stats\fR\*(T>() and \*(T<\fBsg_get_cpu_stats_r\fR\*(T>() deliver native cpu counters since the machine has been started, \*(T<\fBsg_get_cpu_stats_diff\fR\*(T>() and \*(T<\fBsg_get_cpu_stats_diff_between\fR\*(T>() deliver native cpu counters between two \*(T<\fBsg_get_cpu_stats\fR\*(T>() calls and \*(T<\fBsg_get_cpu_percents_of\fR\*(T>() and \*(T<\fBsg_get_cpu_percents_r\fR\*(T>() deliver correlated relative cpu counters (where total is 100%). .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_cpu_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_cpu_stats_diff T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_stats_diff_between T} T{ \*(T * T} T{ caller T} T{ sg_get_cpu_percents_of T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_cpu_percents_r T} T{ \*(T * T} T{ caller T} .TE .PP The \*(T buffer received from \*(T<\fBsg_get_cpu_stats_r\fR\*(T>() and the \*(T<\fBsg_get_cpu_stats_diff_between\fR\*(T>() as well as the \*(T buffer received from \*(T<\fBsg_get_cpu_percents_r\fR\*(T>() must be freed using \*(T<\fBsg_free_cpu_stats\fR\*(T>() or the \*(T<\fBsg_free_cpu_percents\fR\*(T>(), respectively, when not needed any more. The caller is responsible for doing it. .PP The value stored (the "ticks") will vary between operating systems. For example Solaris has a total of 100 per second, while Linux has substantially more. Also, different operating systems store different information - you won't find nice cpu on Solaris for example. .PP Modern systems shall provide information about the clock tick resolution by invoking \*(T. .SH "RETURN VALUES" There are two structures returned by the CPU statistics functions. .PP .nf \*(T< typedef struct { unsigned long long user; unsigned long long kernel; unsigned long long idle; unsigned long long iowait; unsigned long long swap; unsigned long long nice; unsigned long long total; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long syscalls; unsigned long long interrupts; unsigned long long soft_interrupts; time_t systime; } sg_cpu_stats; \*(T> .fi .PP .nf \*(T< typedef struct { double user; double kernel; double idle; double iowait; double swap; double nice; time_t time_taken; } sg_cpu_percents; \*(T> .fi .TP \*(T \*(T \*(T \*(T \*(T \*(T \*(T The different CPU states. .TP \*(T \*(T \*(T \*(T \*(T \*(T The different program actions on CPU. .TP \*(T \*(T The time taken in seconds since the last call of the function, or the system time. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_fs_compare_mnt_point.3000644 001750 001750 00000024706 12200045616 024131 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_fs_stats 3 2013-06-20 i-scream "" .SH NAME sg_get_fs_stats, sg_get_fs_stats_r, sg_get_fs_stats_diff, sg_get_fs_stats_diff_between, sg_free_fs_stats, sg_get_valid_filesystems, sg_set_valid_filesystems, sg_fs_compare_device_name, sg_fs_compare_mnt_point \- get file system statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_fs_stats *\fIcur\fR, const sg_fs_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_fs_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const char *\fIvalid_fs\fR[]);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_fs_stats\fR\*(T> functions provide statistics of mounted file systems. Both functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The \*(T<\fBsg_get_fs_stats\fR\*(T>() and \*(T<\fBsg_get_fs_stats_r\fR\*(T>() functions deliver the file system statistics of the moment the function is called. The \*(T<\fBsg_get_fs_stats_diff\fR\*(T>() and \*(T<\fBsg_get_fs_stats_diff_between\fR\*(T>() deliver the difference between two calls of \*(T<\fBsg_get_fs_stats\fR\*(T>() or \*(T<\fBsg_get_fs_stats_r\fR\*(T>(), respectively. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_fs_stats T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_fs_stats_r T} T{ \*(T * T} T{ caller T} T{ sg_get_fs_stats_diff T} T{ \*(T * T} T{ libstatgrab (thread local) T} T{ sg_get_fs_stats_diff_between T} T{ \*(T * T} T{ caller T} T{ sg_get_valid_filesystems T} T{ char ** T} T{ libstatgrab (global) T} .TE .PP The \*(T vectors received from \*(T<\fBsg_get_fs_stats_r\fR\*(T>() or \*(T<\fBsg_get_fs_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_fs_stats\fR\*(T>() when not needed anymore. The caller is responsible for doing it. .PP The statgrab library comes with a built-in list of valid file system types depending on the operating system it was compiled for. Some operating systems additionally provide an API to learn the file system types known or valid to the running OS instance, which is used when detected. Nevertheless there are known problems when collecting file system statistics: network file systems are mounted from delaunched servers, file system developers run an experimental driver etc. .PP To prevent processes hang in getting file system statistics or allow developers to test their drivers, the processes may modify the list of valid file systems using the \*(T<\fBsg_get_valid_filesystems\fR\*(T>() and the \*(T<\fBsg_set_valid_filesystems\fR\*(T>(). The list of \*(T parameters both functions work with is always finished with an element pointing to NULL. .PP The returned list of \*(T<\fBsg_get_valid_filesystems\fR\*(T>() must not be modified. Always copy the list into an own structure, if you plan to extend or reduce the list: \fBRemove Network FS Example\fR .PP .nf \*(T< int compare_fs_type(const void *va, const void *vb) { const char **a = (const char **)va; const char **b = (const char **)vb; return strcmp( *a, *b ); } void filter_network_fs_types(void) { /* known network file system names on different platforms */ const char *nfs_types[] = { "nfs", "nfs3", "nfs4", "cifs", "smbfs", "samba" }; const size_t nfs_types_count = sizeof(nfs_types) / sizeof(nfs_types[0]) size_t fs_entries = 0; const char **orig_valid_fs = sg_get_valid_filesystems(&fs_entries); /* duplicate into own memory to modify list */ char **valid_fs = calloc( entries + 1, sizeof(valid_fs[0]) ); memcpy( valid_fs, orig_valid_fs, (entries + 1) * sizeof(valid_fs[0]) ); size_t i; for( i = 0; i < nfs_types_count; ++i ) { char **inv_fs = bsearch( &nfs_types[i], &valid_fs[0], fs_entries, sizeof(valid_fs[0]), compare_fs_type ); if( NULL != inv_fs ) { /* copy including trailing NULL pointer */ memmove( inv_fs, inv_fs + 1, fs_entries \- (inv_fs \- valid_fs) ); \-\-fs_entries; } } sg_set_valid_filesystems( valid_fs ); free( valid_fs ); } \*(T> .fi Note that there's no need to duplicate the strings contained in the list of valid file systems in the above example - they aren't modified. .PP The list returned by \*(T<\fBsg_get_valid_filesystems\fR\*(T>() might become invalid when used while the process makes calls to \*(T<\fBsg_set_valid_filesystems\fR\*(T>(). None of the sg_fs_stats functions protect the access to the globally used storage where the own copy of the list of the valid file systems is held. It's the responsibility of the caller not to mix configuration calls with calls to fetch statistics. .PP Additionally two support functions for \*(T<\fBqsort\fR\*(T>(3) are available: \*(T<\fBsg_fs_compare_device_name\fR\*(T>() and \*(T<\fBsg_fs_compare_mnt_point\fR\*(T>(). \fBSort Example\fR .PP .nf \*(T< size_t entries; sg_fs_stats *fs_stats = NULL; while( NULL != ( fs_stats = sg_get_fs_stats_diff(&entries) ) ) { /* order entries alphabetically using the mountpoint */ qsort( fs_stats, entries, sizeof(fs_stats[0]), &sg_fs_compare_mnt_point ); show_fs_stats( fs_stats ); } \*(T> .fi .SH "RETURN VALUES" \*(T<\fBsg_get_fs_stats\fR\*(T> returns a pointer to a structure of type \*(T. .PP .nf \*(T< typedef enum { sg_fs_unknown = 0, sg_fs_regular = 1 << 0, sg_fs_special = 1 << 1, sg_fs_loopback = 1 << 2, sg_fs_remote = 1 << 3, sg_fs_local = (sg_fs_regular | sg_fs_special), sg_fs_alltypes = (sg_fs_regular | sg_fs_special | sg_fs_loopback | sg_fs_remote) } sg_fs_device_type; \*(T> .fi .PP .nf \*(T< typedef struct { char *device_name; char *fs_type; char *mnt_point; sg_fs_device_type device_type; unsigned long long size; unsigned long long used; unsigned long long free; unsigned long long avail; unsigned long long total_inodes; unsigned long long used_inodes; unsigned long long free_inodes; unsigned long long avail_inodes; unsigned long long io_size; unsigned long long block_size; unsigned long long total_blocks; unsigned long long free_blocks; unsigned long long used_blocks; unsigned long long avail_blocks; time_t systime; } sg_fs_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be hda) .TP \*(T The file system type of the file system (eg. hpfs or ufs). .TP \*(T The mount point at which the file system is mounted. .TP \*(T The device type of the file system, currently not filled and always sg_fs_unknown. .TP \*(T The total size, in bytes, of the file system. size = used + free .TP \*(T The amount of space, in bytes, used on the file system. .TP \*(T The amount of space, in bytes, available on the file system for non-privileged users/processes (free space less reserved space). avail = free - reserved .TP \*(T The amount of space, in bytes, free on the file system. .TP \*(T The total number of inodes in the file system. .TP \*(T The number of used inodes in the file system. .TP \*(T The number of free inodes in the file system. .TP \*(T The number of free inodes available to non-privileged processes. .TP \*(T A suggested optimal block size for I/O operations -- if you're reading or writing lots of data, do it in chunks of this size. .TP \*(T The size in bytes of the minimum unit of allocation on this file system. .TP \*(T The total number of blocks in the file system. .TP \*(T The number of free blocks in the file system. .TP \*(T The number of used blocks in the file system. .TP \*(T The number of free blocks available to non-privileged processes. .TP \*(T The time in seconds since epoch when the statistic was retrieved from kernel. .SH BUGS Only mounted file systems are recognised. .PP Some file systems might be reported twice when mounted on different mount points. .PP The compare functions exist rather for backward compatibility than for functionality enhancements. Limited flexibility (e.g. reverse order) and lack of optimising opportunities for the compiler leads to the recommendation to implement the required compare routines locally. .PP Calling \*(T<\fBsg_set_valid_filesystems\fR\*(T> with an empty list with clear the internal list of valid file systems. There's currently no way to reset to the initial list. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/libstatgrab/sg_get_network_io_stats.3000644 001750 001750 00000014226 12200045617 024156 0ustar00tdbusers000000 000000 .\" t .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH sg_get_network_io_stats 3 2013-06-07 i-scream "" .SH NAME sg_get_network_io_stats, sg_get_network_io_stats_r, sg_get_network_io_stats_diff, sg_get_network_io_stats_diff_between, sg_free_network_io_stats, sg_network_io_compare_name \- get network statistics .SH SYNOPSIS 'nh .nf \*(T<#include \*(T> .fi .sp 1 .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const sg_network_io_stats *\fIcur\fR, const sg_network_io_stats *\fIlast\fR, size_t *\fIentries\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(sg_network_iface_stats *\fIdata\fR);\*(T> 'in \n(.iu-\nxu .ad b .PP .fi .ad l \*(T \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu \*(T<(const void *\fIva\fR, const void *\fIvb\fR);\*(T> 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION The \*(T<\fBsg_get_network_io_stats\fR\*(T> functions provide network interface I/O statistics on a per interface basis. All get- and diff-functions take an optional \*(T parameter, which points (when given) to a size_t to take the number of returned vector entries. .PP The \*(T<\fBsg_get_network_io_stats\fR\*(T>() and \*(T<\fBsg_get_network_io_stats_r\fR\*(T>() functions deliver the I/O-statistics since the interface has been attached to the system. The \*(T<\fBsg_get_network_io_stats_diff\fR\*(T>() and \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T>() deliver the difference between two calls of \*(T<\fBsg_get_network_io_stats\fR\*(T>() or \*(T<\fBsg_get_network_io_stats_r\fR\*(T>(), respectively. .PP \fBAPI Shortcut\fR .TS allbox ; l | l | l. T{ function T} T{ returns T} T{ data owner T} .T& l | l | l. T{ sg_get_network_io_stats T} T{ sg_network_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_network_io_stats_r T} T{ sg_network_io_stats * T} T{ caller T} T{ sg_get_network_io_stats_diff T} T{ sg_network_io_stats * T} T{ libstatgrab (thread local) T} T{ sg_get_network_io_stats_diff_between T} T{ sg_network_io_stats * T} T{ caller T} .TE .PP \*(T vectors received from \*(T<\fBsg_get_network_io_stats_r\fR\*(T>() or \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T>() must be freed using \*(T<\fBsg_free_network_io_stats\fR\*(T>() when not needed any more. The caller is responsible for doing it. .PP Additionally a support function for \*(T<\fBqsort\fR\*(T>(3) are available: \*(T<\fBsg_network_io_compare_name\fR\*(T>(). \fBExample\fR .PP .nf \*(T< size_t entries; sg_network_io_stats *network_stats = NULL; while( NULL != ( network_stats = sg_get_network_io_stats_diff(&entries) ) ) { /* sort interface by name */ qsort( network_stats, entries, sizeof(network_stats[0]), &sg_network_io_compare_name ); show_network_io_stats( network_stats ); } \*(T> .fi .PP \*(T<\fBsg_get_network_io_stats\fR\*(T> returns the network traffic stored in the kernel which holds the amount of data transferred since device was attached. On some platforms, such as Solaris 7, this value is stored in a 32bit int, so wraps around when it reaches 4GB. Other platforms, such as Solaris 8, hold the value in a 64bit int, which wraps somewhere near 17 million terabytes. The \*(T<\fBsg_get_network_io_stats_diff\fR\*(T>() function and the \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T>() function care about these overflows and try to detect overflows when the diff is calculated. .SH "RETURN VALUES" All network statistics return a pointer to a structure of type \*(T. .PP .nf \*(T< typedef struct { char *interface_name; unsigned long long tx; unsigned long long rx; unsigned long long ipackets; unsigned long long opackets; unsigned long long ierrors; unsigned long long oerrors; unsigned long long collisions; time_t systime; } sg_network_io_stats; \*(T> .fi .TP \*(T The name known to the operating system. (eg. on linux it might be eth0, on AIX en0 and on FreeBSD fxp0) .TP \*(T The number of bytes transmitted. .TP \*(T The number of bytes received. .TP \*(T The number of packets received. .TP \*(T The number of packets transmitted. .TP \*(T The number of receive errors. .TP \*(T The number of transmit errors. .TP \*(T The number of collisions. .TP \*(T The timestamp when the above stats where collected in seconds since epoch or the time period over which \*(T and \*(T were transferred. .SH BUGS \*(T<\fBsg_get_network_io_stats_diff\fR\*(T> and \*(T<\fBsg_get_network_io_stats_diff_between\fR\*(T> compare two lists of network interface related I/O statistics. Each entry occurring only in the second list is passed through to the resulting list as if it would have been compared to an entry with all statistic values set to 0. This implies, on the very first call \*(T<\fBsg_get_network_io_stats_diff\fR\*(T> will return the same as \*(T<\fBsg_get_network_io_stats\fR\*(T>. .PP On operating systems that hold only 32bits of data there is a problem if the values wrap twice. For example, on Solaris 7 if 9GB is transferred and the operating system wraps at 4GB, the \*(T<\fBsg_get_network_io_stats_diff\fR\*(T> function will return 5GB. .SH "SEE ALSO" \fBstatgrab\fR(3) .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/saidar/saidar.1000644 001750 001750 00000003621 12200045620 017425 0ustar00tdbusers000000 000000 .\" -*- coding: us-ascii -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH saidar 1 2013-06-07 i-scream "" .SH NAME saidar \- a curses-based tool for viewing system statistics .SH SYNOPSIS 'nh .fi .ad l \fBsaidar\fR \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu [-d \fIdelay\fR] [-c] [-v] [-h] 'in \n(.iu-\nxu .ad b 'hy .SH DESCRIPTION \fBsaidar\fR is a curses-based tool for viewing the system statistics available through libstatgrab. Statistics include CPU, processes, load, memory, swap, network I/O, disk I/O, and file system information. .SH OPTIONS The following options are supported. .TP \*(T<\fB\-d\fR\*(T> \fIDELAY\fR Wait DELAY seconds between updates (default 3) .TP \*(T<\fB\-c\fR\*(T> Enables coloured output .TP \*(T<\fB\-v\fR\*(T> Prints the version number .TP \*(T<\fB\-h\fR\*(T> Display help and exits .SH "COLOURED OUTPUT" When the \*(T<\fB\-c\fR\*(T> option is used saidar uses colours to display the data. Each area has a different colour to distinguish it from the nearby fields. Bold and reverse video effects are used to emphasis fields where necessary. .PP The load average figures are displayed in bold when they're notably (greater that 1) different to each other. This purely shows that a change in the load is occurring. .PP When CPU usage goes over 60% it will be displayed in bold. At 90% the field is displayed using reverse video. Likewise for memory, swap and disk usage at 75% and 90%. Zombie processes are also highlighted. .PP Other values (paging, disk I/O and network I/O) are not highlighted due to the nature of the values; it's not easy to determine what thresholds are significant. .SH "SEE ALSO" \fBstatgrab\fR(1) \fBstatgrab\fR(3) .SH AUTHORS This man page was derived from the man page written by Bartosz Fenski for the Debian GNU/Linux distribution. .SH WEBSITE \(lahttp://www.i-scream.org/libstatgrab/\(ra libstatgrab-0.90/docs/saidar/Makefile.in000644 001750 001750 00000036777 12200045540 020170 0ustar00tdbusers000000 000000 # Makefile.in generated by automake 1.12.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile for libstatgrab/docs/saidar # http://www.i-scream.org/libstatgrab/ # $Id$ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = docs/saidar DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_lib.m4 \ $(top_srcdir)/m4/ax_ncurses.m4 $(top_srcdir)/m4/ax_perl5.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_shellvars.m4 $(top_srcdir)/m4/ax_types.m4 \ $(top_srcdir)/m4/ax_visibility.m4 $(top_srcdir)/m4/ax_win32.m4 \ $(top_srcdir)/m4/ax_xopen.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(man_MANS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIN_GROUP = @BIN_GROUP@ BIN_OWNER = @BIN_OWNER@ BIN_PERM = @BIN_PERM@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CLIBFLAGS = @CLIBFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOCBOOK2MAN = @DOCBOOK2MAN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ HAVE_LIBLOG4CPLUS = @HAVE_LIBLOG4CPLUS@ INC_LOG4CPLUS = @INC_LOG4CPLUS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBS_LOG4CPLUS = @LIBS_LOG4CPLUS@ LIBTOOL = @LIBTOOL@ LINKFLAGS = @LINKFLAGS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL5 = @PERL5@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SAIDARCPPFLAGS = @SAIDARCPPFLAGS@ SAIDARLIBS = @SAIDARLIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SG_EXPORT = @SG_EXPORT@ SG_IMPORT = @SG_IMPORT@ SG_PRIVATE = @SG_PRIVATE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_LIBLOG4CPLUS = @WITH_LIBLOG4CPLUS@ WITH_THREADS_CONFIGURED = @WITH_THREADS_CONFIGURED@ WITH_VISIBILITY_SUPPORT = @WITH_VISIBILITY_SUPPORT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log4cplus_CFLAGS = @log4cplus_CFLAGS@ log4cplus_LIBS = @log4cplus_LIBS@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @SAIDAR_TRUE@man_MANS = saidar.1 EXTRA_DIST = $(man_MANS) @BUILD_MANPAGES_TRUE@MAINTAINERCLEANFILES = $(man_MANS) all: all-am .SUFFIXES: .SUFFIXES: .1 .xml $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign docs/saidar/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign docs/saidar/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: cscope cscopelist: distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the 'missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically 'make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man1 \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ uninstall uninstall-am uninstall-man uninstall-man1 @BUILD_MANPAGES_TRUE@.xml.1: @BUILD_MANPAGES_TRUE@ $(DOCBOOK2MAN) -N --symlinks --string-param \ @BUILD_MANPAGES_TRUE@ header-3="`git log -1 --format='%ad' --date=short $<`" \ @BUILD_MANPAGES_TRUE@ $< # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libstatgrab-0.90/docs/saidar/Makefile.am000644 001750 001750 00000000507 12200025312 020130 0ustar00tdbusers000000 000000 # Makefile for libstatgrab/docs/saidar # http://www.i-scream.org/libstatgrab/ # $Id$ if SAIDAR man_MANS = saidar.1 endif EXTRA_DIST = $(man_MANS) if BUILD_MANPAGES MAINTAINERCLEANFILES= $(man_MANS) .xml.1: $(DOCBOOK2MAN) -N --symlinks --string-param \ header-3="`git log -1 --format='%ad' --date=short $<`" \ $< endif libstatgrab-0.90/tests/Makefile.am000644 001750 001750 00000000576 12200025312 017105 0ustar00tdbusers000000 000000 # Makefile for libstatgrab/docs # http://www.i-scream.org/libstatgrab/ # $Id$ SUBDIRS = testlib $(tests_dirs) tests_dirs = single_threaded $(threaded_tests_dirs) if ENABLE_THREADS threaded_tests_dirs = multi_threaded endif if TEST_SCRIPTS test: $(PERL5) -MApp::Prove -e 'my $$app = App::Prove->new(); $$app->process_args(@ARGV); exit( $$app->run ? 0 : 1 );' $(tests_dirs) endif libstatgrab-0.90/tests/testlib/000755 001750 001750 00000000000 12200045621 016514 5ustar00tdbusers000000 000000 libstatgrab-0.90/tests/Makefile.in000644 001750 001750 00000045110 12200045540 017114 0ustar00tdbusers000000 000000 # Makefile.in generated by automake 1.12.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile for libstatgrab/docs # http://www.i-scream.org/libstatgrab/ # $Id$ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = tests DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_lib.m4 \ $(top_srcdir)/m4/ax_ncurses.m4 $(top_srcdir)/m4/ax_perl5.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_shellvars.m4 $(top_srcdir)/m4/ax_types.m4 \ $(top_srcdir)/m4/ax_visibility.m4 $(top_srcdir)/m4/ax_win32.m4 \ $(top_srcdir)/m4/ax_xopen.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = testlib single_threaded multi_threaded DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIN_GROUP = @BIN_GROUP@ BIN_OWNER = @BIN_OWNER@ BIN_PERM = @BIN_PERM@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CLIBFLAGS = @CLIBFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOCBOOK2MAN = @DOCBOOK2MAN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ HAVE_LIBLOG4CPLUS = @HAVE_LIBLOG4CPLUS@ INC_LOG4CPLUS = @INC_LOG4CPLUS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBS_LOG4CPLUS = @LIBS_LOG4CPLUS@ LIBTOOL = @LIBTOOL@ LINKFLAGS = @LINKFLAGS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL5 = @PERL5@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SAIDARCPPFLAGS = @SAIDARCPPFLAGS@ SAIDARLIBS = @SAIDARLIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SG_EXPORT = @SG_EXPORT@ SG_IMPORT = @SG_IMPORT@ SG_PRIVATE = @SG_PRIVATE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_LIBLOG4CPLUS = @WITH_LIBLOG4CPLUS@ WITH_THREADS_CONFIGURED = @WITH_THREADS_CONFIGURED@ WITH_VISIBILITY_SUPPORT = @WITH_VISIBILITY_SUPPORT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log4cplus_CFLAGS = @log4cplus_CFLAGS@ log4cplus_LIBS = @log4cplus_LIBS@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = testlib $(tests_dirs) tests_dirs = single_threaded $(threaded_tests_dirs) @ENABLE_THREADS_TRUE@threaded_tests_dirs = multi_threaded all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done cscopelist-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \ cscopelist-recursive ctags-recursive install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ cscopelist cscopelist-recursive ctags ctags-recursive \ distclean distclean-generic distclean-libtool distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-recursive uninstall uninstall-am @TEST_SCRIPTS_TRUE@test: @TEST_SCRIPTS_TRUE@ $(PERL5) -MApp::Prove -e 'my $$app = App::Prove->new(); $$app->process_args(@ARGV); exit( $$app->run ? 0 : 1 );' $(tests_dirs) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libstatgrab-0.90/tests/multi_threaded/000755 001750 001750 00000000000 12200045621 020040 5ustar00tdbusers000000 000000 libstatgrab-0.90/tests/single_threaded/000755 001750 001750 00000000000 12200045621 020167 5ustar00tdbusers000000 000000 libstatgrab-0.90/tests/single_threaded/full_stats.c000644 001750 001750 00000005255 12200025312 022515 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2010-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #include #include #define NLOOPS 1 struct opt_def opt_def[] = { #define OPT_HLP 0 { 'h', opt_flag, { 0 } }, /* help */ #define OPT_LIST 1 { 'l', opt_flag, { 0 } }, /* list */ #define OPT_RUN 2 { 'r', opt_str, { 0 } }, /* run */ #define OPT_NLOOPS 3 { 'n', opt_unsigned, { NLOOPS } }, /* num-loops */ { 0, opt_flag, { 0 } } }; void help(char *prgname) { printf( "%s -h|-l|-r [options]\n" "\t-h\tshow help\n" "\t-l\tlist available test functions\n" "\t-r\trun specified list of test calls (comma separated list\n" "\t\tof test functions from the list showed by -l)\n" "\t-n\tnumber of loops to run (must be greater or equal to 1)\n", prgname ); } int main(int argc, char **argv) { sg_log_init("libstatgrab-test", "SGTEST_LOG_PROPERTIES", argc ? argv[0] : NULL); sg_init(1); if( 0 != get_params( opt_def, argc, argv ) ) { help(argv[0]); return 1; } if( opt_def[OPT_HLP].optarg.b ) { help(argv[0]); return 0; } else if( opt_def[OPT_LIST].optarg.b ) { print_testable_functions(1); return 0; } else if( opt_def[OPT_RUN].optarg.str ) { size_t *test_routines = NULL; size_t entries = funcnames_to_indices(opt_def[OPT_RUN].optarg.str, &test_routines, 1); int errors = 0; if( 0 == entries ) { die( ESRCH, "no functions to test" ); return 255; } while( opt_def[OPT_NLOOPS].optarg.u-- > 0 ) { size_t func_rel_idx; for( func_rel_idx = 0; func_rel_idx < entries; ++func_rel_idx ) { mark_func(test_routines[func_rel_idx]); if( !run_func( test_routines[func_rel_idx], 1 ) ) { done_func(test_routines[func_rel_idx], 0); ++errors; } else { done_func(test_routines[func_rel_idx], 1); } } } (void)report_testable_functions(1); free(test_routines); return errors; } help(argv[0]); return 1; } libstatgrab-0.90/tests/single_threaded/libstatgrab-test.properties000644 001750 001750 00000000361 12200025312 025553 0ustar00tdbusers000000 000000 log4cplus.logger.statgrab=TRACE, LOGFILE log4cplus.appender.LOGFILE=log4cplus::FileAppender log4cplus.appender.LOGFILE.File=./statgrab.log4cplus log4cplus.appender.LOGFILE.Append=true log4cplus.appender.LOGFILE.layout=log4cplus::TTCCLayout libstatgrab-0.90/tests/single_threaded/Makefile.in000644 001750 001750 00000051316 12200045540 022242 0ustar00tdbusers000000 000000 # Makefile.in generated by automake 1.12.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile for libstatgrab/examples # http://www.i-scream.org/libstatgrab/ # $Id$ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) subdir = tests/single_threaded DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_lib.m4 \ $(top_srcdir)/m4/ax_ncurses.m4 $(top_srcdir)/m4/ax_perl5.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_shellvars.m4 $(top_srcdir)/m4/ax_types.m4 \ $(top_srcdir)/m4/ax_visibility.m4 $(top_srcdir)/m4/ax_win32.m4 \ $(top_srcdir)/m4/ax_xopen.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__EXEEXT_1 = full_stats$(EXEEXT) diff_stats$(EXEEXT) @TEST_SCRIPTS_TRUE@am__EXEEXT_2 = full_stats.t$(EXEEXT) \ @TEST_SCRIPTS_TRUE@ diff_stats.t$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) diff_stats_SOURCES = diff_stats.c diff_stats_OBJECTS = diff_stats.$(OBJEXT) diff_stats_LDADD = $(LDADD) diff_stats_DEPENDENCIES = \ $(top_builddir)/src/libstatgrab/libstatgrab.la \ $(top_builddir)/tests/testlib/libtestlib.a am__diff_stats_t_SOURCES_DIST = $(srcdir)/../testlib/run_tests.t.in \ run_tests.synopsis.in am_diff_stats_t_OBJECTS = diff_stats_t_OBJECTS = $(am_diff_stats_t_OBJECTS) diff_stats_t_LDADD = $(LDADD) diff_stats_t_DEPENDENCIES = \ $(top_builddir)/src/libstatgrab/libstatgrab.la \ $(top_builddir)/tests/testlib/libtestlib.a full_stats_SOURCES = full_stats.c full_stats_OBJECTS = full_stats.$(OBJEXT) full_stats_LDADD = $(LDADD) full_stats_DEPENDENCIES = \ $(top_builddir)/src/libstatgrab/libstatgrab.la \ $(top_builddir)/tests/testlib/libtestlib.a am__full_stats_t_SOURCES_DIST = $(srcdir)/../testlib/run_tests.t.in \ run_tests.synopsis.in am_full_stats_t_OBJECTS = full_stats_t_OBJECTS = $(am_full_stats_t_OBJECTS) full_stats_t_LDADD = $(LDADD) full_stats_t_DEPENDENCIES = \ $(top_builddir)/src/libstatgrab/libstatgrab.la \ $(top_builddir)/tests/testlib/libtestlib.a DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = diff_stats.c $(diff_stats_t_SOURCES) full_stats.c \ $(full_stats_t_SOURCES) DIST_SOURCES = diff_stats.c $(am__diff_stats_t_SOURCES_DIST) \ full_stats.c $(am__full_stats_t_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIN_GROUP = @BIN_GROUP@ BIN_OWNER = @BIN_OWNER@ BIN_PERM = @BIN_PERM@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CLIBFLAGS = @CLIBFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOCBOOK2MAN = @DOCBOOK2MAN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ HAVE_LIBLOG4CPLUS = @HAVE_LIBLOG4CPLUS@ INC_LOG4CPLUS = @INC_LOG4CPLUS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBS_LOG4CPLUS = @LIBS_LOG4CPLUS@ LIBTOOL = @LIBTOOL@ LINKFLAGS = @LINKFLAGS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL5 = @PERL5@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SAIDARCPPFLAGS = @SAIDARCPPFLAGS@ SAIDARLIBS = @SAIDARLIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SG_EXPORT = @SG_EXPORT@ SG_IMPORT = @SG_IMPORT@ SG_PRIVATE = @SG_PRIVATE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_LIBLOG4CPLUS = @WITH_LIBLOG4CPLUS@ WITH_THREADS_CONFIGURED = @WITH_THREADS_CONFIGURED@ WITH_VISIBILITY_SUPPORT = @WITH_VISIBILITY_SUPPORT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log4cplus_CFLAGS = @log4cplus_CFLAGS@ log4cplus_LIBS = @log4cplus_LIBS@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = run_tests.synopsis.in libstatgrab-test.properties test_bin = full_stats diff_stats AM_CPPFLAGS = -I$(top_srcdir) -I$(top_builddir)\ -I$(top_srcdir)/src -I$(top_builddir)/src\ -I$(top_srcdir)/src/libstatgrab -I$(top_builddir)/src/libstatgrab \ -I$(top_srcdir)/tests/testlib \ @CLIBFLAGS@ LDADD = $(top_builddir)/src/libstatgrab/libstatgrab.la $(top_builddir)/tests/testlib/libtestlib.a @LINKFLAGS@ @TEST_SCRIPTS_TRUE@full_stats_edit = $(PERL5) $(srcdir)/../testlib/mk_run_tests.pl \ @TEST_SCRIPTS_TRUE@ -d srcdir="$(srcdir)" \ @TEST_SCRIPTS_TRUE@ -d test-bin="full_stats" \ @TEST_SCRIPTS_TRUE@ -d test-name=full-stats \ @TEST_SCRIPTS_TRUE@ -d test-dir="$(subdir)" \ @TEST_SCRIPTS_TRUE@ -f synopsis=$(srcdir)/run_tests.synopsis.in @TEST_SCRIPTS_TRUE@diff_stats_edit = $(PERL5) $(srcdir)/../testlib/mk_run_tests.pl \ @TEST_SCRIPTS_TRUE@ -d srcdir="$(srcdir)" \ @TEST_SCRIPTS_TRUE@ -d test-bin="diff_stats" \ @TEST_SCRIPTS_TRUE@ -d test-name=diff-stats \ @TEST_SCRIPTS_TRUE@ -d test-dir="$(subdir)" \ @TEST_SCRIPTS_TRUE@ -f synopsis=$(srcdir)/run_tests.synopsis.in @TEST_SCRIPTS_TRUE@test_script = full_stats.t diff_stats.t @TEST_SCRIPTS_TRUE@full_stats_t_SOURCES = $(srcdir)/../testlib/run_tests.t.in run_tests.synopsis.in @TEST_SCRIPTS_TRUE@diff_stats_t_SOURCES = $(srcdir)/../testlib/run_tests.t.in run_tests.synopsis.in all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/single_threaded/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/single_threaded/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list diff_stats$(EXEEXT): $(diff_stats_OBJECTS) $(diff_stats_DEPENDENCIES) $(EXTRA_diff_stats_DEPENDENCIES) @rm -f diff_stats$(EXEEXT) $(LINK) $(diff_stats_OBJECTS) $(diff_stats_LDADD) $(LIBS) @TEST_SCRIPTS_FALSE@diff_stats.t$(EXEEXT): $(diff_stats_t_OBJECTS) $(diff_stats_t_DEPENDENCIES) $(EXTRA_diff_stats_t_DEPENDENCIES) @TEST_SCRIPTS_FALSE@ @rm -f diff_stats.t$(EXEEXT) @TEST_SCRIPTS_FALSE@ $(LINK) $(diff_stats_t_OBJECTS) $(diff_stats_t_LDADD) $(LIBS) full_stats$(EXEEXT): $(full_stats_OBJECTS) $(full_stats_DEPENDENCIES) $(EXTRA_full_stats_DEPENDENCIES) @rm -f full_stats$(EXEEXT) $(LINK) $(full_stats_OBJECTS) $(full_stats_LDADD) $(LIBS) @TEST_SCRIPTS_FALSE@full_stats.t$(EXEEXT): $(full_stats_t_OBJECTS) $(full_stats_t_DEPENDENCIES) $(EXTRA_full_stats_t_DEPENDENCIES) @TEST_SCRIPTS_FALSE@ @rm -f full_stats.t$(EXEEXT) @TEST_SCRIPTS_FALSE@ $(LINK) $(full_stats_t_OBJECTS) $(full_stats_t_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diff_stats.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/full_stats.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS cscopelist ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am @TEST_SCRIPTS_TRUE@full_stats.t: Makefile $(srcdir)/../testlib/mk_run_tests.pl $(srcdir)/../testlib/run_tests.t.in run_tests.synopsis.in @TEST_SCRIPTS_TRUE@ rm -f $@ $@.tmp @TEST_SCRIPTS_TRUE@ srcdir=''; \ @TEST_SCRIPTS_TRUE@ test -f ../testlib/$@.in || srcdir=$(srcdir)/; \ @TEST_SCRIPTS_TRUE@ $(full_stats_edit) -i $${srcdir}../testlib/run_tests.t.in >$@.tmp @TEST_SCRIPTS_TRUE@ chmod +rx $@.tmp @TEST_SCRIPTS_TRUE@ chmod a-w $@.tmp @TEST_SCRIPTS_TRUE@ mv $@.tmp $@ @TEST_SCRIPTS_TRUE@diff_stats.t: Makefile $(srcdir)/../testlib/mk_run_tests.pl $(srcdir)/../testlib/run_tests.t.in run_tests.synopsis.in @TEST_SCRIPTS_TRUE@ rm -f $@ $@.tmp @TEST_SCRIPTS_TRUE@ srcdir=''; \ @TEST_SCRIPTS_TRUE@ test -f ../testlib/$@.in || srcdir=$(srcdir)/; \ @TEST_SCRIPTS_TRUE@ $(diff_stats_edit) -i $${srcdir}../testlib/run_tests.t.in >$@.tmp @TEST_SCRIPTS_TRUE@ chmod +rx $@.tmp @TEST_SCRIPTS_TRUE@ chmod a-w $@.tmp @TEST_SCRIPTS_TRUE@ mv $@.tmp $@ @TEST_SCRIPTS_TRUE@test: $(noinst_PROGRAMS) @TEST_SCRIPTS_TRUE@ $(PERL5) -MApp::Prove -e 'my $$app = App::Prove->new(); $$app->process_args(@ARGV); exit( $$app->run ? 0 : 1 );' . # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libstatgrab-0.90/tests/single_threaded/run_tests.synopsis.in000644 001750 001750 00000000320 12200025312 024421 0ustar00tdbusers000000 000000 # run all functions alone and all 2-tuple in 3 loops $ @test-dir@/run_tests --items 1 --items 2 -- -n 3 # run all 4-tuple of libstatgrab functions in 2 loops $ @test-dir@/run_tests --items 4 -- -n 2 libstatgrab-0.90/tests/single_threaded/Makefile.am000644 001750 001750 00000003754 12200025312 022227 0ustar00tdbusers000000 000000 # Makefile for libstatgrab/examples # http://www.i-scream.org/libstatgrab/ # $Id$ noinst_PROGRAMS = $(test_bin) $(test_script) EXTRA_DIST = run_tests.synopsis.in libstatgrab-test.properties test_bin = full_stats diff_stats AM_CPPFLAGS = -I$(top_srcdir) -I$(top_builddir)\ -I$(top_srcdir)/src -I$(top_builddir)/src\ -I$(top_srcdir)/src/libstatgrab -I$(top_builddir)/src/libstatgrab \ -I$(top_srcdir)/tests/testlib \ @CLIBFLAGS@ LDADD = $(top_builddir)/src/libstatgrab/libstatgrab.la $(top_builddir)/tests/testlib/libtestlib.a @LINKFLAGS@ if TEST_SCRIPTS full_stats_edit= $(PERL5) $(srcdir)/../testlib/mk_run_tests.pl \ -d srcdir="$(srcdir)" \ -d test-bin="full_stats" \ -d test-name=full-stats \ -d test-dir="$(subdir)" \ -f synopsis=$(srcdir)/run_tests.synopsis.in diff_stats_edit= $(PERL5) $(srcdir)/../testlib/mk_run_tests.pl \ -d srcdir="$(srcdir)" \ -d test-bin="diff_stats" \ -d test-name=diff-stats \ -d test-dir="$(subdir)" \ -f synopsis=$(srcdir)/run_tests.synopsis.in test_script = full_stats.t diff_stats.t full_stats_t_SOURCES = $(srcdir)/../testlib/run_tests.t.in run_tests.synopsis.in full_stats.t: Makefile $(srcdir)/../testlib/mk_run_tests.pl $(srcdir)/../testlib/run_tests.t.in run_tests.synopsis.in rm -f $@ $@.tmp srcdir=''; \ test -f ../testlib/$@.in || srcdir=$(srcdir)/; \ $(full_stats_edit) -i $${srcdir}../testlib/run_tests.t.in >$@.tmp chmod +rx $@.tmp chmod a-w $@.tmp mv $@.tmp $@ diff_stats_t_SOURCES = $(srcdir)/../testlib/run_tests.t.in run_tests.synopsis.in diff_stats.t: Makefile $(srcdir)/../testlib/mk_run_tests.pl $(srcdir)/../testlib/run_tests.t.in run_tests.synopsis.in rm -f $@ $@.tmp srcdir=''; \ test -f ../testlib/$@.in || srcdir=$(srcdir)/; \ $(diff_stats_edit) -i $${srcdir}../testlib/run_tests.t.in >$@.tmp chmod +rx $@.tmp chmod a-w $@.tmp mv $@.tmp $@ test: $(noinst_PROGRAMS) $(PERL5) -MApp::Prove -e 'my $$app = App::Prove->new(); $$app->process_args(@ARGV); exit( $$app->run ? 0 : 1 );' . endif libstatgrab-0.90/tests/single_threaded/diff_stats.c000644 001750 001750 00000005255 12200025312 022463 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2010-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #include #include #define NLOOPS 1 struct opt_def opt_def[] = { #define OPT_HLP 0 { 'h', opt_flag, { 0 } }, /* help */ #define OPT_LIST 1 { 'l', opt_flag, { 0 } }, /* list */ #define OPT_RUN 2 { 'r', opt_str, { 0 } }, /* run */ #define OPT_NLOOPS 3 { 'n', opt_unsigned, { NLOOPS } }, /* num-loops */ { 0, opt_flag, { 0 } } }; void help(char *prgname) { printf( "%s -h|-l|-r [options]\n" "\t-h\tshow help\n" "\t-l\tlist available test functions\n" "\t-r\trun specified list of test calls (comma separated list\n" "\t\tof test functions from the list showed by -l)\n" "\t-n\tnumber of loops to run (must be greater or equal to 1)\n", prgname ); } int main(int argc, char **argv) { sg_log_init("libstatgrab-test", "SGTEST_LOG_PROPERTIES", argc ? argv[0] : NULL); sg_init(1); if( 0 != get_params( opt_def, argc, argv ) ) { help(argv[0]); return 1; } if( opt_def[OPT_HLP].optarg.b ) { help(argv[0]); return 0; } else if( opt_def[OPT_LIST].optarg.b ) { print_testable_functions(0); return 0; } else if( opt_def[OPT_RUN].optarg.str ) { size_t *test_routines = NULL; size_t entries = funcnames_to_indices(opt_def[OPT_RUN].optarg.str, &test_routines, 0); int errors = 0; if( 0 == entries ) { die( ESRCH, "no functions to test" ); return 255; } while( opt_def[OPT_NLOOPS].optarg.u-- > 0 ) { size_t func_rel_idx; for( func_rel_idx = 0; func_rel_idx < entries; ++func_rel_idx ) { mark_func(test_routines[func_rel_idx]); if( !run_func( test_routines[func_rel_idx], 0 ) ) { done_func(test_routines[func_rel_idx], 0); ++errors; } else { done_func(test_routines[func_rel_idx], 1); } } } (void)report_testable_functions(0); free(test_routines); return errors; } help(argv[0]); return 1; } libstatgrab-0.90/tests/multi_threaded/libstatgrab-test.properties000644 001750 001750 00000000361 12200025312 025424 0ustar00tdbusers000000 000000 log4cplus.logger.statgrab=TRACE, LOGFILE log4cplus.appender.LOGFILE=log4cplus::FileAppender log4cplus.appender.LOGFILE.File=./statgrab.log4cplus log4cplus.appender.LOGFILE.Append=true log4cplus.appender.LOGFILE.layout=log4cplus::TTCCLayout libstatgrab-0.90/tests/multi_threaded/Makefile.am000644 001750 001750 00000003754 12200025312 022100 0ustar00tdbusers000000 000000 # Makefile for libstatgrab/examples # http://www.i-scream.org/libstatgrab/ # $Id$ noinst_PROGRAMS = $(test_bin) $(test_script) EXTRA_DIST = run_tests.synopsis.in libstatgrab-test.properties test_bin = full_stats diff_stats AM_CPPFLAGS = -I$(top_srcdir) -I$(top_builddir)\ -I$(top_srcdir)/src -I$(top_builddir)/src\ -I$(top_srcdir)/src/libstatgrab -I$(top_builddir)/src/libstatgrab \ -I$(top_srcdir)/tests/testlib \ @CLIBFLAGS@ LDADD = $(top_builddir)/src/libstatgrab/libstatgrab.la $(top_builddir)/tests/testlib/libtestlib.a @LINKFLAGS@ if TEST_SCRIPTS full_stats_edit= $(PERL5) $(srcdir)/../testlib/mk_run_tests.pl \ -d srcdir="$(srcdir)" \ -d test-bin="full_stats" \ -d test-name=full-stats \ -d test-dir="$(subdir)" \ -f synopsis=$(srcdir)/run_tests.synopsis.in diff_stats_edit= $(PERL5) $(srcdir)/../testlib/mk_run_tests.pl \ -d srcdir="$(srcdir)" \ -d test-bin="diff_stats" \ -d test-name=diff-stats \ -d test-dir="$(subdir)" \ -f synopsis=$(srcdir)/run_tests.synopsis.in test_script = full_stats.t diff_stats.t full_stats_t_SOURCES = $(srcdir)/../testlib/run_tests.t.in run_tests.synopsis.in full_stats.t: Makefile $(srcdir)/../testlib/mk_run_tests.pl $(srcdir)/../testlib/run_tests.t.in run_tests.synopsis.in rm -f $@ $@.tmp srcdir=''; \ test -f ../testlib/$@.in || srcdir=$(srcdir)/; \ $(full_stats_edit) -i $${srcdir}../testlib/run_tests.t.in >$@.tmp chmod +rx $@.tmp chmod a-w $@.tmp mv $@.tmp $@ diff_stats_t_SOURCES = $(srcdir)/../testlib/run_tests.t.in run_tests.synopsis.in diff_stats.t: Makefile $(srcdir)/../testlib/mk_run_tests.pl $(srcdir)/../testlib/run_tests.t.in run_tests.synopsis.in rm -f $@ $@.tmp srcdir=''; \ test -f ../testlib/$@.in || srcdir=$(srcdir)/; \ $(diff_stats_edit) -i $${srcdir}../testlib/run_tests.t.in >$@.tmp chmod +rx $@.tmp chmod a-w $@.tmp mv $@.tmp $@ test: $(noinst_PROGRAMS) $(PERL5) -MApp::Prove -e 'my $$app = App::Prove->new(); $$app->process_args(@ARGV); exit( $$app->run ? 0 : 1 );' . endif libstatgrab-0.90/tests/multi_threaded/run_tests.synopsis.in000644 001750 001750 00000000576 12200025312 024307 0ustar00tdbusers000000 000000 # run all functions alone and all 2-tuple, each in 3 threads $ @test-dir@/run_tests --items 1 --items 2 -- -m 3 # run all 4-tuple of libstatgrab functions, use at least 40 threads $ @test-dir@/run_tests --items 4 -- -n 40 # run all 7-tuple of libstatgrab functions, each in 5 threads but # sequencial function execution $ @test-dir@/run_tests --items 4 -- -m 5 -s 1 libstatgrab-0.90/tests/multi_threaded/diff_stats.c000644 001750 001750 00000014411 12200025312 022326 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2010-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #include #include static void prove_libcall(char *libcall, int err_code) { if( err_code != 0 ) die( err_code, "invoking %s failed", libcall ); } /* For safe condition variable usage, must use a boolean predicate and */ /* a mutex with the condition. */ int conditionMet = 0; unsigned long test_counter = 0; pthread_cond_t cond = PTHREAD_COND_INITIALIZER; #ifdef NEED_PTHREAD_MUTEX_INITIALIZER_BRACES pthread_mutex_t mutex = { PTHREAD_MUTEX_INITIALIZER }; #else pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; #endif struct opt_def opt_def[] = { #define OPT_HLP 0 { 'h', opt_flag, { 0 } }, /* help */ #define OPT_LIST 1 { 'l', opt_flag, { 0 } }, /* list */ #define OPT_RUN 2 { 'r', opt_str, { 0 } }, /* run */ #define OPT_NTHREADS 3 { 'n', opt_unsigned, { -1 } }, /* num-threads */ #define OPT_MTHREADS 4 { 'm', opt_unsigned, { 1 } }, /* multiple threads */ #define OPT_SEQ 5 { 's', opt_bool, { 0 } }, /* sequential test execution */ { 0, opt_flag, { 0 } } }; void * threadfunc(void *parm) { int rc, success; unsigned long func_idx = *((unsigned long *)parm); rc = pthread_mutex_lock(&mutex); prove_libcall("pthread_mutex_lock", rc); ++test_counter; while (!conditionMet) { TRACE_LOG( "multi_threaded", "Thread blocked" ); rc = pthread_cond_wait(&cond, &mutex); prove_libcall("pthread_cond_wait", rc); } if( !opt_def[OPT_SEQ].optarg.b ) { rc = pthread_mutex_unlock(&mutex); prove_libcall("pthread_mutex_unlock", rc); } success = run_func( func_idx, 0 ); if( !opt_def[OPT_SEQ].optarg.b ) { rc = pthread_mutex_lock(&mutex); prove_libcall("pthread_mutex_lock", rc); } done_func(func_idx, success); rc = pthread_mutex_unlock(&mutex); prove_libcall("pthread_mutex_unlock", rc); pthread_cond_signal(&cond); return NULL; } void help(char *prgname) { printf( "%s -h|-l|-r [options]\n" "\t-h\tshow help\n" "\t-l\tlist available test functions\n" "\t-r\trun specified list of test calls (comma separated list\n" "\t\tof test functions from the list showed by -l)\n" "\t-n\tnumber of threads to use (must be greater or equal to\n" "\t\tnumber of test calls)\n" "\t-m\tmultiple threads/calls per function\n" "\t-s\tsequencial calling of test functions\n", prgname ); } int main(int argc, char **argv) { sg_log_init("libstatgrab-test", "SGTEST_LOG_PROPERTIES", argc ? argv[0] : NULL); sg_init(1); if( 0 != get_params( opt_def, argc, argv ) ) { help(argv[0]); return 1; } if( opt_def[OPT_HLP].optarg.b ) { help(argv[0]); return 0; } else if( opt_def[OPT_LIST].optarg.b ) { print_testable_functions(0); return 0; } else if( opt_def[OPT_RUN].optarg.str ) { unsigned long numthreads, i, nfuncs, ok; size_t *test_routines = NULL; struct statgrab_testfuncs *sg_testfuncs = get_testable_functions(&nfuncs); size_t entries = funcnames_to_indices(opt_def[OPT_RUN].optarg.str, &test_routines, 0); pthread_t *threadid = NULL; int rc, errors = 0; if( 0 == entries ) { die( ESRCH, "no functions to test" ); return 255; } if( -1 != opt_def[OPT_NTHREADS].optarg.s ) { numthreads = opt_def[OPT_NTHREADS].optarg.u; if( numthreads < entries ) { die( ERANGE, "%s %s - to small number for thread count", argv[0], argv[2] ); } } else if( opt_def[OPT_MTHREADS].optarg.u > 1 ) { numthreads = entries * opt_def[OPT_MTHREADS].optarg.u; } else { numthreads = entries; } if( NULL == ( threadid = calloc( sizeof(threadid[0]), numthreads ) ) ) die( ENOMEM, "%s", argv[0] ); rc = pthread_mutex_lock(&mutex); prove_libcall("pthread_mutex_lock", rc); TRACE_LOG_FMT( "multi_threaded", "create %lu threads", numthreads ); for( i = 0; i < numthreads; ++i ) { mark_func(test_routines[i % entries]); rc = pthread_create( &threadid[i], NULL, threadfunc, &test_routines[i % entries] ); prove_libcall("pthread_create", rc); } rc = pthread_mutex_unlock(&mutex); prove_libcall("pthread_mutex_unlock", rc); while( test_counter < numthreads ) sched_yield(); rc = pthread_mutex_lock(&mutex); prove_libcall("pthread_mutex_lock", rc); /* The condition has occured. Set the flag and wake up any waiting threads */ conditionMet = 1; TRACE_LOG( "multi_threaded", "Wake up all waiting threads..." ); rc = pthread_cond_broadcast(&cond); prove_libcall("pthread_cond_broadcast", rc); rc = pthread_mutex_unlock(&mutex); prove_libcall("pthread_mutex_unlock", rc); TRACE_LOG( "multi_threaded", "Wait for threads and cleanup" ); do { struct timespec ts = { 1, 0 }; struct timeval tv; gettimeofday(&tv, NULL); ts.tv_sec += tv.tv_sec; rc = pthread_mutex_lock(&mutex); prove_libcall("pthread_mutex_lock", rc); pthread_cond_timedwait(&cond, &mutex, &ts); prove_libcall("pthread_cond_timedwait", rc); ok = report_testable_functions(0); rc = pthread_mutex_unlock(&mutex); prove_libcall("pthread_mutex_unlock", rc); if( ok != nfuncs ) printf( "---------------\n" ); fflush(stdout); } while( ok != nfuncs ); for (i=0; i/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) subdir = tests/multi_threaded DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_lib.m4 \ $(top_srcdir)/m4/ax_ncurses.m4 $(top_srcdir)/m4/ax_perl5.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_shellvars.m4 $(top_srcdir)/m4/ax_types.m4 \ $(top_srcdir)/m4/ax_visibility.m4 $(top_srcdir)/m4/ax_win32.m4 \ $(top_srcdir)/m4/ax_xopen.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__EXEEXT_1 = full_stats$(EXEEXT) diff_stats$(EXEEXT) @TEST_SCRIPTS_TRUE@am__EXEEXT_2 = full_stats.t$(EXEEXT) \ @TEST_SCRIPTS_TRUE@ diff_stats.t$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) diff_stats_SOURCES = diff_stats.c diff_stats_OBJECTS = diff_stats.$(OBJEXT) diff_stats_LDADD = $(LDADD) diff_stats_DEPENDENCIES = \ $(top_builddir)/src/libstatgrab/libstatgrab.la \ $(top_builddir)/tests/testlib/libtestlib.a am__diff_stats_t_SOURCES_DIST = $(srcdir)/../testlib/run_tests.t.in \ run_tests.synopsis.in am_diff_stats_t_OBJECTS = diff_stats_t_OBJECTS = $(am_diff_stats_t_OBJECTS) diff_stats_t_LDADD = $(LDADD) diff_stats_t_DEPENDENCIES = \ $(top_builddir)/src/libstatgrab/libstatgrab.la \ $(top_builddir)/tests/testlib/libtestlib.a full_stats_SOURCES = full_stats.c full_stats_OBJECTS = full_stats.$(OBJEXT) full_stats_LDADD = $(LDADD) full_stats_DEPENDENCIES = \ $(top_builddir)/src/libstatgrab/libstatgrab.la \ $(top_builddir)/tests/testlib/libtestlib.a am__full_stats_t_SOURCES_DIST = $(srcdir)/../testlib/run_tests.t.in \ run_tests.synopsis.in am_full_stats_t_OBJECTS = full_stats_t_OBJECTS = $(am_full_stats_t_OBJECTS) full_stats_t_LDADD = $(LDADD) full_stats_t_DEPENDENCIES = \ $(top_builddir)/src/libstatgrab/libstatgrab.la \ $(top_builddir)/tests/testlib/libtestlib.a DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = diff_stats.c $(diff_stats_t_SOURCES) full_stats.c \ $(full_stats_t_SOURCES) DIST_SOURCES = diff_stats.c $(am__diff_stats_t_SOURCES_DIST) \ full_stats.c $(am__full_stats_t_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIN_GROUP = @BIN_GROUP@ BIN_OWNER = @BIN_OWNER@ BIN_PERM = @BIN_PERM@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CLIBFLAGS = @CLIBFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOCBOOK2MAN = @DOCBOOK2MAN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ HAVE_LIBLOG4CPLUS = @HAVE_LIBLOG4CPLUS@ INC_LOG4CPLUS = @INC_LOG4CPLUS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBS_LOG4CPLUS = @LIBS_LOG4CPLUS@ LIBTOOL = @LIBTOOL@ LINKFLAGS = @LINKFLAGS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL5 = @PERL5@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SAIDARCPPFLAGS = @SAIDARCPPFLAGS@ SAIDARLIBS = @SAIDARLIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SG_EXPORT = @SG_EXPORT@ SG_IMPORT = @SG_IMPORT@ SG_PRIVATE = @SG_PRIVATE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_LIBLOG4CPLUS = @WITH_LIBLOG4CPLUS@ WITH_THREADS_CONFIGURED = @WITH_THREADS_CONFIGURED@ WITH_VISIBILITY_SUPPORT = @WITH_VISIBILITY_SUPPORT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log4cplus_CFLAGS = @log4cplus_CFLAGS@ log4cplus_LIBS = @log4cplus_LIBS@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = run_tests.synopsis.in libstatgrab-test.properties test_bin = full_stats diff_stats AM_CPPFLAGS = -I$(top_srcdir) -I$(top_builddir)\ -I$(top_srcdir)/src -I$(top_builddir)/src\ -I$(top_srcdir)/src/libstatgrab -I$(top_builddir)/src/libstatgrab \ -I$(top_srcdir)/tests/testlib \ @CLIBFLAGS@ LDADD = $(top_builddir)/src/libstatgrab/libstatgrab.la $(top_builddir)/tests/testlib/libtestlib.a @LINKFLAGS@ @TEST_SCRIPTS_TRUE@full_stats_edit = $(PERL5) $(srcdir)/../testlib/mk_run_tests.pl \ @TEST_SCRIPTS_TRUE@ -d srcdir="$(srcdir)" \ @TEST_SCRIPTS_TRUE@ -d test-bin="full_stats" \ @TEST_SCRIPTS_TRUE@ -d test-name=full-stats \ @TEST_SCRIPTS_TRUE@ -d test-dir="$(subdir)" \ @TEST_SCRIPTS_TRUE@ -f synopsis=$(srcdir)/run_tests.synopsis.in @TEST_SCRIPTS_TRUE@diff_stats_edit = $(PERL5) $(srcdir)/../testlib/mk_run_tests.pl \ @TEST_SCRIPTS_TRUE@ -d srcdir="$(srcdir)" \ @TEST_SCRIPTS_TRUE@ -d test-bin="diff_stats" \ @TEST_SCRIPTS_TRUE@ -d test-name=diff-stats \ @TEST_SCRIPTS_TRUE@ -d test-dir="$(subdir)" \ @TEST_SCRIPTS_TRUE@ -f synopsis=$(srcdir)/run_tests.synopsis.in @TEST_SCRIPTS_TRUE@test_script = full_stats.t diff_stats.t @TEST_SCRIPTS_TRUE@full_stats_t_SOURCES = $(srcdir)/../testlib/run_tests.t.in run_tests.synopsis.in @TEST_SCRIPTS_TRUE@diff_stats_t_SOURCES = $(srcdir)/../testlib/run_tests.t.in run_tests.synopsis.in all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/multi_threaded/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/multi_threaded/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list diff_stats$(EXEEXT): $(diff_stats_OBJECTS) $(diff_stats_DEPENDENCIES) $(EXTRA_diff_stats_DEPENDENCIES) @rm -f diff_stats$(EXEEXT) $(LINK) $(diff_stats_OBJECTS) $(diff_stats_LDADD) $(LIBS) @TEST_SCRIPTS_FALSE@diff_stats.t$(EXEEXT): $(diff_stats_t_OBJECTS) $(diff_stats_t_DEPENDENCIES) $(EXTRA_diff_stats_t_DEPENDENCIES) @TEST_SCRIPTS_FALSE@ @rm -f diff_stats.t$(EXEEXT) @TEST_SCRIPTS_FALSE@ $(LINK) $(diff_stats_t_OBJECTS) $(diff_stats_t_LDADD) $(LIBS) full_stats$(EXEEXT): $(full_stats_OBJECTS) $(full_stats_DEPENDENCIES) $(EXTRA_full_stats_DEPENDENCIES) @rm -f full_stats$(EXEEXT) $(LINK) $(full_stats_OBJECTS) $(full_stats_LDADD) $(LIBS) @TEST_SCRIPTS_FALSE@full_stats.t$(EXEEXT): $(full_stats_t_OBJECTS) $(full_stats_t_DEPENDENCIES) $(EXTRA_full_stats_t_DEPENDENCIES) @TEST_SCRIPTS_FALSE@ @rm -f full_stats.t$(EXEEXT) @TEST_SCRIPTS_FALSE@ $(LINK) $(full_stats_t_OBJECTS) $(full_stats_t_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diff_stats.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/full_stats.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS cscopelist ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am @TEST_SCRIPTS_TRUE@full_stats.t: Makefile $(srcdir)/../testlib/mk_run_tests.pl $(srcdir)/../testlib/run_tests.t.in run_tests.synopsis.in @TEST_SCRIPTS_TRUE@ rm -f $@ $@.tmp @TEST_SCRIPTS_TRUE@ srcdir=''; \ @TEST_SCRIPTS_TRUE@ test -f ../testlib/$@.in || srcdir=$(srcdir)/; \ @TEST_SCRIPTS_TRUE@ $(full_stats_edit) -i $${srcdir}../testlib/run_tests.t.in >$@.tmp @TEST_SCRIPTS_TRUE@ chmod +rx $@.tmp @TEST_SCRIPTS_TRUE@ chmod a-w $@.tmp @TEST_SCRIPTS_TRUE@ mv $@.tmp $@ @TEST_SCRIPTS_TRUE@diff_stats.t: Makefile $(srcdir)/../testlib/mk_run_tests.pl $(srcdir)/../testlib/run_tests.t.in run_tests.synopsis.in @TEST_SCRIPTS_TRUE@ rm -f $@ $@.tmp @TEST_SCRIPTS_TRUE@ srcdir=''; \ @TEST_SCRIPTS_TRUE@ test -f ../testlib/$@.in || srcdir=$(srcdir)/; \ @TEST_SCRIPTS_TRUE@ $(diff_stats_edit) -i $${srcdir}../testlib/run_tests.t.in >$@.tmp @TEST_SCRIPTS_TRUE@ chmod +rx $@.tmp @TEST_SCRIPTS_TRUE@ chmod a-w $@.tmp @TEST_SCRIPTS_TRUE@ mv $@.tmp $@ @TEST_SCRIPTS_TRUE@test: $(noinst_PROGRAMS) @TEST_SCRIPTS_TRUE@ $(PERL5) -MApp::Prove -e 'my $$app = App::Prove->new(); $$app->process_args(@ARGV); exit( $$app->run ? 0 : 1 );' . # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libstatgrab-0.90/tests/multi_threaded/full_stats.c000644 001750 001750 00000014411 12200025312 022360 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2010-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #include #include static void prove_libcall(char *libcall, int err_code) { if( err_code != 0 ) die( err_code, "invoking %s failed", libcall ); } /* For safe condition variable usage, must use a boolean predicate and */ /* a mutex with the condition. */ int conditionMet = 0; unsigned long test_counter = 0; pthread_cond_t cond = PTHREAD_COND_INITIALIZER; #ifdef NEED_PTHREAD_MUTEX_INITIALIZER_BRACES pthread_mutex_t mutex = { PTHREAD_MUTEX_INITIALIZER }; #else pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; #endif struct opt_def opt_def[] = { #define OPT_HLP 0 { 'h', opt_flag, { 0 } }, /* help */ #define OPT_LIST 1 { 'l', opt_flag, { 0 } }, /* list */ #define OPT_RUN 2 { 'r', opt_str, { 0 } }, /* run */ #define OPT_NTHREADS 3 { 'n', opt_unsigned, { -1 } }, /* num-threads */ #define OPT_MTHREADS 4 { 'm', opt_unsigned, { 1 } }, /* multiple threads */ #define OPT_SEQ 5 { 's', opt_bool, { 0 } }, /* sequential test execution */ { 0, opt_flag, { 0 } } }; void * threadfunc(void *parm) { int rc, success; unsigned long func_idx = *((unsigned long *)parm); rc = pthread_mutex_lock(&mutex); prove_libcall("pthread_mutex_lock", rc); ++test_counter; while (!conditionMet) { TRACE_LOG( "multi_threaded", "Thread blocked" ); rc = pthread_cond_wait(&cond, &mutex); prove_libcall("pthread_cond_wait", rc); } if( !opt_def[OPT_SEQ].optarg.b ) { rc = pthread_mutex_unlock(&mutex); prove_libcall("pthread_mutex_unlock", rc); } success = run_func( func_idx, 1 ); if( !opt_def[OPT_SEQ].optarg.b ) { rc = pthread_mutex_lock(&mutex); prove_libcall("pthread_mutex_lock", rc); } done_func(func_idx, success); rc = pthread_mutex_unlock(&mutex); prove_libcall("pthread_mutex_unlock", rc); pthread_cond_signal(&cond); return NULL; } void help(char *prgname) { printf( "%s -h|-l|-r [options]\n" "\t-h\tshow help\n" "\t-l\tlist available test functions\n" "\t-r\trun specified list of test calls (comma separated list\n" "\t\tof test functions from the list showed by -l)\n" "\t-n\tnumber of threads to use (must be greater or equal to\n" "\t\tnumber of test calls)\n" "\t-m\tmultiple threads/calls per function\n" "\t-s\tsequencial calling of test functions\n", prgname ); } int main(int argc, char **argv) { sg_log_init("libstatgrab-test", "SGTEST_LOG_PROPERTIES", argc ? argv[0] : NULL); sg_init(1); if( 0 != get_params( opt_def, argc, argv ) ) { help(argv[0]); return 1; } if( opt_def[OPT_HLP].optarg.b ) { help(argv[0]); return 0; } else if( opt_def[OPT_LIST].optarg.b ) { print_testable_functions(1); return 0; } else if( opt_def[OPT_RUN].optarg.str ) { unsigned long numthreads, i, nfuncs, ok; size_t *test_routines = NULL; struct statgrab_testfuncs *sg_testfuncs = get_testable_functions(&nfuncs); size_t entries = funcnames_to_indices(opt_def[OPT_RUN].optarg.str, &test_routines, 1); pthread_t *threadid = NULL; int rc, errors = 0; if( 0 == entries ) { die( ESRCH, "no functions to test" ); return 255; } if( -1 != opt_def[OPT_NTHREADS].optarg.s ) { numthreads = opt_def[OPT_NTHREADS].optarg.u; if( numthreads < entries ) { die( ERANGE, "%s %s - to small number for thread count", argv[0], argv[2] ); } } else if( opt_def[OPT_MTHREADS].optarg.u > 1 ) { numthreads = entries * opt_def[OPT_MTHREADS].optarg.u; } else { numthreads = entries; } if( NULL == ( threadid = calloc( sizeof(threadid[0]), numthreads ) ) ) die( ENOMEM, "%s", argv[0] ); rc = pthread_mutex_lock(&mutex); prove_libcall("pthread_mutex_lock", rc); TRACE_LOG_FMT( "multi_threaded", "create %lu threads", numthreads ); for( i = 0; i < numthreads; ++i ) { mark_func(test_routines[i % entries]); rc = pthread_create( &threadid[i], NULL, threadfunc, &test_routines[i % entries] ); prove_libcall("pthread_create", rc); } rc = pthread_mutex_unlock(&mutex); prove_libcall("pthread_mutex_unlock", rc); while( test_counter < numthreads ) sched_yield(); rc = pthread_mutex_lock(&mutex); prove_libcall("pthread_mutex_lock", rc); /* The condition has occured. Set the flag and wake up any waiting threads */ conditionMet = 1; TRACE_LOG( "multi_threaded", "Wake up all waiting threads..." ); rc = pthread_cond_broadcast(&cond); prove_libcall("pthread_cond_broadcast", rc); rc = pthread_mutex_unlock(&mutex); prove_libcall("pthread_mutex_unlock", rc); TRACE_LOG( "multi_threaded", "Wait for threads and cleanup" ); do { struct timespec ts = { 1, 0 }; struct timeval tv; gettimeofday(&tv, NULL); ts.tv_sec += tv.tv_sec; rc = pthread_mutex_lock(&mutex); prove_libcall("pthread_mutex_lock", rc); pthread_cond_timedwait(&cond, &mutex, &ts); prove_libcall("pthread_cond_timedwait", rc); ok = report_testable_functions(1); rc = pthread_mutex_unlock(&mutex); prove_libcall("pthread_mutex_unlock", rc); if( ok != nfuncs ) printf( "---------------\n" ); fflush(stdout); } while( ok != nfuncs ); for (i=0; i $exename, ); my $self = bless( \%instance, $class ); return $self; } sub get_test_functions { my ($self) = @_; defined($self->{test_functions}) and return $self->{test_functions}; my $exename = basename($self->{exename}); # prepare logging to temporary file only during tests running my ($logfh, $logfn) = File::Temp::tempfile( TMPDIR => 1, UNLINK => 1, SUFFIX => ".log", TEMPLATE => "$exename-XXXXXXXX" ); close($logfh); my ($propfh, $propfn) = File::Temp::tempfile( TMPDIR => 1, UNLINK => 1, SUFFIX => ".properties", TEMPLATE => "SG_TEST_XXXXXXX" ); print $propfh <flush(); $ENV{SGTEST_LOG_PROPERTIES} = $propfn; my $fh; open( $fh, "-|", "$self->{exename} -l" ) or die "Can't read from pipe: $!"; my @funcs = <$fh>; close( $fh ) or die "Can't close pipe: $!"; chomp @funcs; $self->{test_functions} = \@funcs; return $self->{test_functions}; } sub init_combinations { my ($self) = @_; defined( $self->{combinations} ) and return; $self->get_test_functions(); $self->{combinations} = []; my $nfuncs = scalar(@{$self->{test_functions}}); my @funcs_idx = (0 .. ($nfuncs - 1) ); $self->{combinations}->[0] = []; $self->{combinations}->[$nfuncs] = [ [ @funcs_idx ] ]; $self->{test_function_avail_map} = { map { $_ => $_ } @funcs_idx }; return; } sub get_test_combinations { my ($self, $k) = @_; my $inv_k; my $want_inv = 0; $k > 0 or $k <= scalar(@{$self->{test_functions}}) or return; $self->init_combinations(); defined( $self->{combinations}->[$k] ) and return @{ $self->{combinations}->[$k] }; if( $k > ( scalar(@{$self->{test_functions}}) / 2 ) ) { $inv_k = $k; $k = scalar(@{$self->{test_functions}}) - $k; $want_inv = 1; } else { $inv_k = scalar(@{$self->{test_functions}}) - $k; } my @combinations = combine_nk( scalar(@{$self->{test_functions}}), $k ); my @inverse_combinations; foreach my $combination (@combinations) { my %remain_func_idx = %{$self->{test_function_avail_map}}; delete @remain_func_idx{@$combination}; my @inverse_combination = sort { $a <=> $b } keys %remain_func_idx; push( @inverse_combinations, \@inverse_combination ); } $self->{combinations}->[$k] = \@combinations; $self->{combinations}->[$inv_k] = \@inverse_combinations; return $want_inv ? @{ $self->{combinations}->[$inv_k] } : @{ $self->{combinations}->[$k] }; } sub get_all_test_combinations { my ($self) = @_; defined( $self->{combinations} ) and return map { @{$_} } @{$self->{combinations}}; $self->init_combinations(); my $k = int(scalar(@{$self->{test_functions}}) / 2); while( $k > 0 ) { $self->get_test_combinations( $k ); --$k; } return map { @{$_} } @{$self->{combinations}}; } sub map_test_variant { my ($self,$variant) = @_; my $tests = join( ",", map { $self->{test_functions}->[$_] } @{$variant} ); return $tests; } sub get_versions { my %versions = ( OS => "$^O ($Config::Config{osvers})", Perl => "$] ($Config::Config{archname})", ); for my $mod (qw(IPC::Cmd Test::More)) { $versions{$mod} = $mod->VERSION(); } return %versions; } sub run_tests(\@;\@) { my ($self, $args, $variants) = @_; ref($variants) eq "ARRAY" or $variants = [ $self->get_all_test_combinations() ]; plan( tests => scalar(@{$variants}) ); # complain about environment my %versions = get_versions(); my $indent = 20; my @versions = map { sprintf "%s = %s", $_, $versions{$_} } sort keys %versions; diag(join(", ", @versions)); # prepare logging to STDOUT only during tests running my ($propfh, $propfn) = File::Temp::tempfile( TMPDIR => 1, UNLINK => 1, SUFFIX => ".properties", TEMPLATE => "SG_TEST_XXXXXXX" ); print $propfh <flush(); $ENV{SGTEST_LOG_PROPERTIES} = $propfn; foreach my $variant (@{$variants}) { ref($variant) eq "ARRAY" or die "Invalid element in variant list"; my $test_variant = $self->map_test_variant($variant); my @exec_args = ($self->{exename}, @$args, '-r', $test_variant); my ($success, $error_message, $full_buf, $stdout_buf, $stderr_buf) = IPC::Cmd::run( command => \@exec_args, verbose => 0, timeout => 60 ); defined $success or $success = 0; my $msg_fn = $success ? Test::More->can("note") : Test::More->can("diag"); &{$msg_fn}('"' . join('" "', @exec_args) . '"'); if( "ARRAY" eq ref($stdout_buf) and 0 != scalar(@{$stdout_buf}) ) { foreach my $line (@{$stdout_buf}) { &{$msg_fn}($line); } } if( "ARRAY" eq ref($stderr_buf) and 0 != scalar(@{$stderr_buf}) ) { foreach my $line (@{$stderr_buf}) { diag($line); } } cmp_ok( $success, '==', 1, $test_variant ); } done_testing(); } 1; libstatgrab-0.90/tests/testlib/routines.c000644 001750 001750 00000015473 12200025312 020535 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2010-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #include #include "testlib.h" #define SG_EASY_FUNC(stat,full) { #stat, \ #full, (statgrab_stat_fn)(&full), \ NULL, NULL, \ 0, 0, 0 } #define SG_COMPLEX_FUNC(stat,full,diff) { #stat, \ #full, (statgrab_stat_fn)(&full), \ #diff, (statgrab_stat_fn)(&diff), \ 0, 0, 0 } static struct statgrab_testfuncs statgrab_test_funcs[] = { SG_EASY_FUNC(host_info, sg_get_host_info), SG_COMPLEX_FUNC(cpu_stats, sg_get_cpu_stats, sg_get_cpu_stats_diff), /* XXX cpu_percent */ SG_EASY_FUNC(mem_stats, sg_get_mem_stats), SG_EASY_FUNC(load_stats, sg_get_load_stats), SG_EASY_FUNC(user_stats, sg_get_user_stats), SG_EASY_FUNC(swap_stats, sg_get_swap_stats), SG_COMPLEX_FUNC(fs_stats, sg_get_fs_stats, sg_get_fs_stats_diff), SG_COMPLEX_FUNC(disk_io_stats, sg_get_disk_io_stats,sg_get_disk_io_stats_diff), SG_EASY_FUNC(network_iface_stats, sg_get_network_iface_stats), SG_COMPLEX_FUNC(network_io_stats, sg_get_network_io_stats, sg_get_network_io_stats_diff), SG_COMPLEX_FUNC(page_stats, sg_get_page_stats, sg_get_page_stats_diff), SG_EASY_FUNC(process_stats, sg_get_process_stats) /* XXX process count */ }; struct statgrab_testfuncs * get_testable_functions(size_t *entries) { if(entries) *entries = lengthof(statgrab_test_funcs); return statgrab_test_funcs; } static size_t find_full_func(const char *func_name, size_t namelen) { size_t idx; for( idx = 0; idx < lengthof(statgrab_test_funcs); ++idx ) { if( 0 == strncmp( func_name, statgrab_test_funcs[idx].full_name, namelen ) ) /* XXX memcmp? */ break; } return idx; } static size_t find_diff_func(const char *func_name, size_t namelen) { size_t idx; for( idx = 0; idx < lengthof(statgrab_test_funcs); ++idx ) { if( NULL == statgrab_test_funcs[idx].diff_name ) continue; if( 0 == strncmp( func_name, statgrab_test_funcs[idx].diff_name, namelen ) ) /* XXX memcmp? */ break; } return idx; } #define NAME_OF(a,full) full ? (a).full_name : (a).diff_name size_t funcnames_to_indices(const char *name_list, size_t **indices, int full) { size_t i = 0; const char *name_start; if( ( indices == NULL ) || ( *indices != NULL ) ) return 0; *indices = calloc( lengthof(statgrab_test_funcs), sizeof(indices[0]) ); if( *indices == NULL ) return 0; for( name_start = name_list; *name_list; ++name_list ) { if( ',' == *name_list ) { size_t idx = full ? find_full_func( name_start, name_list - name_start ) : find_diff_func( name_start, name_list - name_start ); if( idx >= lengthof(statgrab_test_funcs) ) { fprintf( stderr, "invalid function name for testing: %s\n", name_start ); exit(255); } DEBUG_LOG_FMT( "testlib", "funcnames_to_indices: found function %s", NAME_OF(statgrab_test_funcs[i],full) ); (*indices)[i++] = idx; name_start = name_list + 1; } } if( name_start < name_list ) { size_t idx = full ? find_full_func( name_start, name_list - name_start ) : find_diff_func( name_start, name_list - name_start ); if( idx >= lengthof(statgrab_test_funcs) ) { fprintf( stderr, "invalid function name for testing: %s\n", name_start ); exit(255); } DEBUG_LOG_FMT( "testlib", "funcnames_to_indices: found function %s", NAME_OF(statgrab_test_funcs[i],full) ); (*indices)[i++] = idx; name_start = name_list + 1; } return i; } void print_testable_functions(int full) { size_t i; for( i = 0; i < lengthof(statgrab_test_funcs); ++i ) { if( !full && NULL == statgrab_test_funcs[i].diff_name ) continue; printf( "%s\n", full ? statgrab_test_funcs[i].full_name : statgrab_test_funcs[i].diff_name ); } } size_t report_testable_functions(int full) { size_t i, ok = 0; for( i = 0; i < lengthof(statgrab_test_funcs); ++i ) { if(0 != statgrab_test_funcs[i].needed) printf( "%s (%s) - needed: %d, succeeded: %d, done: %d\n", statgrab_test_funcs[i].stat_name, full ? statgrab_test_funcs[i].full_name : statgrab_test_funcs[i].diff_name, statgrab_test_funcs[i].needed, statgrab_test_funcs[i].succeeded, statgrab_test_funcs[i].done ); if( statgrab_test_funcs[i].needed == statgrab_test_funcs[i].done ) ++ok; } return ok; } void mark_func(size_t func_index) { if( func_index >= lengthof(statgrab_test_funcs) ) { fprintf( stderr, "mark_func: index out of range: %lu\n", (unsigned long int)(func_index) ); exit(1); } ++statgrab_test_funcs[func_index].needed; } int run_func(size_t func_index, int full) { size_t entries; void *stats; if( func_index >= lengthof(statgrab_test_funcs) ) { fprintf( stderr, "run_func: index out of range: %lu\n", (unsigned long int)(func_index) ); exit(1); } INFO_LOG_FMT( "testlib", "Calling %s...", NAME_OF(statgrab_test_funcs[func_index],full) ); stats = full ? statgrab_test_funcs[func_index].full_fn(&entries) : statgrab_test_funcs[func_index].diff_fn(&entries); #if !(defined(WITH_LIBLOG4CPLUS) || defined(WITH_FULL_CONSOLE_LOGGER)) if(!stats) { sg_error_details err_det; char *errmsg = NULL; sg_error errc; if( SG_ERROR_NONE != ( errc = sg_get_error_details(&err_det) ) ) { fprintf(stderr, "panic: can't get error details (%d, %s)\n", errc, sg_str_error(errc)); } else if( NULL == sg_strperror(&errmsg, &err_det) ) { errc = sg_get_error(); fprintf(stderr, "panic: can't prepare error message (%d, %s)\n", errc, sg_str_error(errc)); } else { fprintf( stderr, "%s: %s\n", NAME_OF(statgrab_test_funcs[func_index],full), errmsg ); } free( errmsg ); } #endif INFO_LOG_FMT( "testlib", "%s - stats = %p, entries = %lu", NAME_OF(statgrab_test_funcs[func_index],full), stats, entries ); return stats != 0; } void done_func(size_t func_index, int succeeded) { if( func_index >= lengthof(statgrab_test_funcs) ) { fprintf( stderr, "done_func: index out of range: %lu\n", (unsigned long int)(func_index) ); exit(1); } ++statgrab_test_funcs[func_index].done; if(succeeded) ++statgrab_test_funcs[func_index].succeeded; } libstatgrab-0.90/tests/testlib/Makefile.am000644 001750 001750 00000000722 12200025312 020544 0ustar00tdbusers000000 000000 # Makefile for libstatgrab/examples # http://www.i-scream.org/libstatgrab/ # $Id$ noinst_LIBRARIES = libtestlib.a EXTRA_DIST = mix_tests.pm run_tests.pm mk_run_tests.pl run_tests.t.in testlib.h # BUILT_HEADERS = helpers.h libtestlib_a_SOURCES = err.c opt.c routines.c AM_CPPFLAGS = -I$(top_srcdir) -I$(top_builddir)\ -I$(top_srcdir)/src -I$(top_builddir)/src\ -I$(top_srcdir)/src/libstatgrab -I$(top_builddir)/src/libstatgrab \ @CLIBFLAGS@ libstatgrab-0.90/tests/testlib/Makefile.in000644 001750 001750 00000041154 12200045540 020566 0ustar00tdbusers000000 000000 # Makefile.in generated by automake 1.12.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile for libstatgrab/examples # http://www.i-scream.org/libstatgrab/ # $Id$ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = tests/testlib DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_lib.m4 \ $(top_srcdir)/m4/ax_ncurses.m4 $(top_srcdir)/m4/ax_perl5.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_shellvars.m4 $(top_srcdir)/m4/ax_types.m4 \ $(top_srcdir)/m4/ax_visibility.m4 $(top_srcdir)/m4/ax_win32.m4 \ $(top_srcdir)/m4/ax_xopen.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru libtestlib_a_AR = $(AR) $(ARFLAGS) libtestlib_a_LIBADD = am_libtestlib_a_OBJECTS = err.$(OBJEXT) opt.$(OBJEXT) \ routines.$(OBJEXT) libtestlib_a_OBJECTS = $(am_libtestlib_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libtestlib_a_SOURCES) DIST_SOURCES = $(libtestlib_a_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIN_GROUP = @BIN_GROUP@ BIN_OWNER = @BIN_OWNER@ BIN_PERM = @BIN_PERM@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CLIBFLAGS = @CLIBFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOCBOOK2MAN = @DOCBOOK2MAN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ HAVE_LIBLOG4CPLUS = @HAVE_LIBLOG4CPLUS@ INC_LOG4CPLUS = @INC_LOG4CPLUS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBS_LOG4CPLUS = @LIBS_LOG4CPLUS@ LIBTOOL = @LIBTOOL@ LINKFLAGS = @LINKFLAGS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL5 = @PERL5@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SAIDARCPPFLAGS = @SAIDARCPPFLAGS@ SAIDARLIBS = @SAIDARLIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SG_EXPORT = @SG_EXPORT@ SG_IMPORT = @SG_IMPORT@ SG_PRIVATE = @SG_PRIVATE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_LIBLOG4CPLUS = @WITH_LIBLOG4CPLUS@ WITH_THREADS_CONFIGURED = @WITH_THREADS_CONFIGURED@ WITH_VISIBILITY_SUPPORT = @WITH_VISIBILITY_SUPPORT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log4cplus_CFLAGS = @log4cplus_CFLAGS@ log4cplus_LIBS = @log4cplus_LIBS@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libtestlib.a EXTRA_DIST = mix_tests.pm run_tests.pm mk_run_tests.pl run_tests.t.in testlib.h # BUILT_HEADERS = helpers.h libtestlib_a_SOURCES = err.c opt.c routines.c AM_CPPFLAGS = -I$(top_srcdir) -I$(top_builddir)\ -I$(top_srcdir)/src -I$(top_builddir)/src\ -I$(top_srcdir)/src/libstatgrab -I$(top_builddir)/src/libstatgrab \ @CLIBFLAGS@ all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/testlib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/testlib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libtestlib.a: $(libtestlib_a_OBJECTS) $(libtestlib_a_DEPENDENCIES) $(EXTRA_libtestlib_a_DEPENDENCIES) -rm -f libtestlib.a $(libtestlib_a_AR) libtestlib.a $(libtestlib_a_OBJECTS) $(libtestlib_a_LIBADD) $(RANLIB) libtestlib.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/err.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/opt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/routines.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLIBRARIES cscopelist ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libstatgrab-0.90/tests/testlib/testlib.h000644 001750 001750 00000004043 12200025312 020327 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2010-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #ifndef __SG_TESTLIB_H_INCLUDED__ #define __SG_TESTLIB_H_INCLUDED__ /* routines.c */ typedef void * (*statgrab_stat_fn)(size_t *entries); struct statgrab_testfuncs { char const *stat_name; char const * full_name; statgrab_stat_fn full_fn; char const * diff_name; statgrab_stat_fn diff_fn; unsigned needed; unsigned succeeded; unsigned done; }; struct statgrab_testfuncs *get_testable_functions(size_t *entries); size_t funcnames_to_indices(const char *name_list, size_t **indices, int full); void print_testable_functions(int full); size_t report_testable_functions(int full); void mark_func(size_t func_index); int run_func(size_t func_index, int full); void done_func(size_t func_index, int succeeded); /* err.c */ int sg_warn(const char *prefix); void sg_die(const char *prefix, int exit_code); void die(int error, const char *fmt, ...); /* opt.c */ enum opt_type { opt_flag = 0, opt_bool, opt_signed, opt_unsigned, opt_str }; struct opt_def { char optchr; enum opt_type opttype; union { long int s; unsigned long int u; bool b; char *str; } optarg; }; int get_params(struct opt_def *opt_defs, int argc, char **argv); #endif /* ?__SG_TESTLIB_H_INCLUDED__ */ libstatgrab-0.90/tests/testlib/run_tests.t.in000644 001750 001750 00000002643 12200025312 021334 0ustar00tdbusers000000 000000 use strict; use warnings; use FindBin (); use lib ("$FindBin::Bin/../testlib"); use lib ("@srcdir@/../testlib"); use Getopt::Long qw(:config bundling); use Data::Dumper ('Dumper'); use Pod::Usage ('pod2usage'); use run_tests (); my %cmdOptions = (); GetOptions( \%cmdOptions, "help|h" => sub { pod2usage(0); }, "items|i=i@" =>, ) or exit(1); my $test_prog = "$FindBin::Bin/@test-bin@"; chdir($FindBin::Bin); my $tester = run_tests->new( $test_prog ); my $test_variants; foreach my $item_count (@{$cmdOptions{items}}) { push( @$test_variants, $tester->get_test_combinations( $item_count ) ); } $tester->run_tests( \@ARGV, $test_variants ); =head1 NAME run_tests (script) - runs the @test-name@ tests =head1 DESCRIPTION This I script runs the @test-name@ tests for libstatgrab. =head1 SYNOPSIS @synopsis@ =head1 OPTIONS =over 8 =item C<--items|-i> Specify how amount of I's functions to test. All possible combinations of k elements from n functions are generated and passed to C<@test-bin@>. =item C<--> Separator for options passed directly to C<@test-bin@>. =back =over 4 =item * The options of C<@test-bin@> can be seen when running C<@test-dir@/@test-bin@> with the C<-h> option. =item * The available libstatgrab functions of C<@test-bin@> can be seen when running C<@test-dir@/@test-bin@> with the C<-l> option. =back =head1 AUTHOR Jens Rehsack =cut libstatgrab-0.90/tests/testlib/opt.c000644 001750 001750 00000004677 12200025312 017473 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2010-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #include #include "testlib.h" int get_params(struct opt_def *opt_defs, int argc, char **argv) { char optlst[256] = { '\0' }; struct opt_def *opt_def_map[256]; size_t optlst_idx = 0; struct opt_def *opt_l; int ch; memset( opt_def_map, 0, sizeof(opt_def_map) ); for( opt_l = opt_defs; opt_l && opt_l->optchr; ++opt_l ) { if( opt_def_map[(unsigned)(opt_l->optchr)] != NULL ) die( EINVAL, "duplicate option def for '%c'", opt_l->optchr ); opt_def_map[(unsigned)(opt_l->optchr)] = opt_l; optlst[optlst_idx++] = opt_l->optchr; if( opt_l->opttype != opt_flag ) optlst[optlst_idx++] = ':'; } optlst[optlst_idx] = '\0'; while( (ch = getopt(argc, argv, optlst)) >= 0 ) { if( ch >= 256 ) { die( EINVAL, "getopt error, rc = %d", ch ); } if( opt_def_map[ch] != 0 ) { switch(opt_def_map[ch]->opttype) { case opt_flag: opt_def_map[ch]->optarg.b = true; break; case opt_bool: { unsigned tmp; if( 1 != sscanf( optarg, "%u", &tmp ) ) die( EINVAL, "getopt: invalid argument for -%c: %s", ch, optarg ); opt_def_map[ch]->optarg.b = tmp != 0; } break; case opt_signed: if( 1 != sscanf( optarg, "%ld", &opt_def_map[ch]->optarg.s ) ) die( EINVAL, "getopt: invalid argument for -%c: %s", ch, optarg ); break; case opt_unsigned: if( 1 != sscanf( optarg, "%lu", &opt_def_map[ch]->optarg.u ) ) die( EINVAL, "getopt: invalid argument for -%c: %s", ch, optarg ); break; case opt_str: opt_def_map[ch]->optarg.str = strdup(optarg); break; } } else { return ch; } } return 0; } libstatgrab-0.90/tests/testlib/mk_run_tests.pl000644 001750 001750 00000002430 12200025312 021560 0ustar00tdbusers000000 000000 #! perl -w use strict; use warnings; use FindBin; use Getopt::Long qw(:config bundling); # use Pod::Usage; sub slurp { my $fn = $_[0]; my $fh; open( $fh, "<", $fn ) or die "Can't open $fn for reading: $!"; local $/; my $file_content = <$fh>; close( $fh ); chomp $file_content; return $file_content; } my %cmdOptions = (); GetOptions( \%cmdOptions, # "help|h" => sub { pod2usage(0); }, "input-file|i=s" =>, #"output-file|o=s" =>, "defines|d=s%" =>, "file-contents|f=s%" =>, ) or exit(1); defined( $cmdOptions{"input-file"} ) or die "Missing input-file"; -r $cmdOptions{"input-file"} or die $cmdOptions{"input-file"} . ": $!"; my $src = slurp($cmdOptions{"input-file"}); if( defined( $cmdOptions{"file-contents"} ) and "HASH" eq ref($cmdOptions{"file-contents"}) ) { my %contents = map { $_ => slurp($cmdOptions{"file-contents"}->{$_}) } keys %{$cmdOptions{"file-contents"}}; my $cntkeys = join( "|", keys %contents ); $src =~ s/@($cntkeys)[@]/$contents{$1}/ge; } if( defined( $cmdOptions{"defines"} ) and "HASH" eq ref($cmdOptions{"defines"}) ) { my %defines = %{$cmdOptions{"defines"}}; my $defkeys = join( "|", keys %defines ); $src =~ s/@($defkeys)[@]/$defines{$1}/ge; } unless( $src =~ m/^#!.*perl/ ) { $src = "#!$^X\n\n$src"; } print "$src\n"; libstatgrab-0.90/tests/testlib/mix_tests.pm000644 001750 001750 00000003503 12200025312 021065 0ustar00tdbusers000000 000000 package mix_tests; use strict; use warnings; use vars qw(@EXPORT @EXPORT_OK @ISA); use Exporter; @ISA = qw(Exporter); @EXPORT = qw(variegate_list combine_list combine_nk totalcombs); @EXPORT_OK = @EXPORT; sub variegate_list($@); sub combine_list($@); sub variegate_list($@) { my ($amount, @items) = @_; my @result; $amount == 1 and return map { [ $_ ] } @items; foreach my $idx ( 0 .. $#items ) { my @copy = @items; my @round_item = splice( @copy, $idx, 1 ); my @round_list = variegate_list( $amount - 1, @copy ); foreach my $sublist (@round_list) { push( @result, [ @round_item, @{$sublist} ] ); } } return @result; } sub totalcombs($$){ my ($n, $k) = @_; my $c = 1; $k > $n and return 0; for my $d ( 1 .. $k ) { $c *= $n--; $c /= $d; $c = int($c); } return $c; } sub combine_nk($$) { my ($n, $k) = @_; my @indx; my @result; @indx = map { $_ } ( 0 .. $k - 1 ); LOOP: while( 1 ) { my @line = map { $indx[$_] } ( 0 .. $k - 1 ); push( @result, \@line ) if @line; for( my $iwk = $k - 1; $iwk >= 0; --$iwk ) { if( $indx[$iwk] <= ($n-1)-($k-$iwk) ) { ++$indx[$iwk]; for my $swk ( $iwk + 1 .. $k - 1 ) { $indx[$swk] = $indx[$swk-1]+1; } next LOOP; } } last; } return @result; } sub combine_list($@) { my ($amount, @items) = @_; my @result; $amount == 1 and return map { [ $_ ] } @items; foreach my $idx ( 0 .. $#items ) { my @copy = @items; my @round_item = splice( @copy, $idx, 1 ); my @round_list = combine_list( $amount - 1, @copy ); foreach my $sublist (@round_list) { push( @result, [ @round_item, @{$sublist} ] ); } } my @sorted = map { [ sort { $a <=> $b } @{$_} ] } @result; my %uniq_sorted; foreach my $si (@sorted) { my $si_key = join(",", @{$si}); $uniq_sorted{$si_key} = $si; } @result = values(%uniq_sorted); return @result; } 1; libstatgrab-0.90/tests/testlib/err.c000644 001750 001750 00000004743 12200025312 017453 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2010-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #include #include "testlib.h" #include int sg_warn(const char *prefix) { sg_error_details err_det; char *errmsg = NULL; int rc; sg_error errc; if( SG_ERROR_NONE != ( errc = sg_get_error_details(&err_det) ) ) { fprintf(stderr, "can't get error details (%d, %s)\n", errc, sg_str_error(errc)); return 0; } if( NULL == sg_strperror(&errmsg, &err_det) ) { errc = sg_get_error(); fprintf(stderr, "panic: can't prepare error message (%d, %s)\n", errc, sg_str_error(errc)); return 0; } rc = fprintf( stderr, "%s: %s\n", prefix, errmsg ); free( errmsg ); return rc; } void sg_die(const char *prefix, int exit_code) { sg_error_details err_det; char *errmsg = NULL; sg_error errc; if( SG_ERROR_NONE != ( errc = sg_get_error_details(&err_det) ) ) { fprintf(stderr, "panic: can't get error details (%d, %s)\n", errc, sg_str_error(errc)); exit(exit_code); } if( NULL == sg_strperror(&errmsg, &err_det) ) { errc = sg_get_error(); fprintf(stderr, "panic: can't prepare error message (%d, %s)\n", errc, sg_str_error(errc)); exit(exit_code); } fprintf( stderr, "%s: %s\n", prefix, errmsg ); free( errmsg ); exit(exit_code); } static void err_doit(int errnoflag, int error, const char *fmt, va_list ap) { char buf[4096]; int printed; printed = vsnprintf( buf, sizeof(buf), fmt, ap); if(errnoflag) snprintf(buf + printed, sizeof(buf) - printed, ": %s", strerror(error) ); fflush(stderr); fputs(buf, stderr); fputs("\n", stderr); fflush(NULL); } void die(int error, const char *fmt, ...) { va_list ap; va_start(ap, fmt); err_doit(1, error, fmt, ap); va_end(ap); exit(1); } libstatgrab-0.90/src/saidar/000755 001750 001750 00000000000 12200045615 015741 5ustar00tdbusers000000 000000 libstatgrab-0.90/src/libstatgrab/000755 001750 001750 00000000000 12200045615 016774 5ustar00tdbusers000000 000000 libstatgrab-0.90/src/statgrab/000755 001750 001750 00000000000 12200045615 016305 5ustar00tdbusers000000 000000 libstatgrab-0.90/src/Makefile.am000644 001750 001750 00000000164 12200025312 016523 0ustar00tdbusers000000 000000 # Makefile for libstatgrab/src # http://www.i-scream.org/libstatgrab/ # $Id$ SUBDIRS = libstatgrab statgrab saidar libstatgrab-0.90/src/Makefile.in000644 001750 001750 00000044420 12200045540 016544 0ustar00tdbusers000000 000000 # Makefile.in generated by automake 1.12.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile for libstatgrab/src # http://www.i-scream.org/libstatgrab/ # $Id$ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_lib.m4 \ $(top_srcdir)/m4/ax_ncurses.m4 $(top_srcdir)/m4/ax_perl5.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_shellvars.m4 $(top_srcdir)/m4/ax_types.m4 \ $(top_srcdir)/m4/ax_visibility.m4 $(top_srcdir)/m4/ax_win32.m4 \ $(top_srcdir)/m4/ax_xopen.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIN_GROUP = @BIN_GROUP@ BIN_OWNER = @BIN_OWNER@ BIN_PERM = @BIN_PERM@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CLIBFLAGS = @CLIBFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOCBOOK2MAN = @DOCBOOK2MAN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ HAVE_LIBLOG4CPLUS = @HAVE_LIBLOG4CPLUS@ INC_LOG4CPLUS = @INC_LOG4CPLUS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBS_LOG4CPLUS = @LIBS_LOG4CPLUS@ LIBTOOL = @LIBTOOL@ LINKFLAGS = @LINKFLAGS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL5 = @PERL5@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SAIDARCPPFLAGS = @SAIDARCPPFLAGS@ SAIDARLIBS = @SAIDARLIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SG_EXPORT = @SG_EXPORT@ SG_IMPORT = @SG_IMPORT@ SG_PRIVATE = @SG_PRIVATE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_LIBLOG4CPLUS = @WITH_LIBLOG4CPLUS@ WITH_THREADS_CONFIGURED = @WITH_THREADS_CONFIGURED@ WITH_VISIBILITY_SUPPORT = @WITH_VISIBILITY_SUPPORT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log4cplus_CFLAGS = @log4cplus_CFLAGS@ log4cplus_LIBS = @log4cplus_LIBS@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = libstatgrab statgrab saidar all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(RECURSIVE_TARGETS) $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done cscopelist-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) cscopelist); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \ cscopelist-recursive ctags-recursive install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ cscopelist cscopelist-recursive ctags ctags-recursive \ distclean distclean-generic distclean-libtool distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libstatgrab-0.90/src/statgrab/statgrab.c000644 001750 001750 00000063015 12200025312 020255 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id$ */ #include "tools.h" #include #include #include #include #include #include typedef enum { LONG_LONG = 0, UNSIGNED_LONG_LONG, BYTES, TIME_T, FLOAT, DOUBLE, STRING, INT, UNSIGNED, BOOL, DUPLEX } stat_type; typedef enum { DISPLAY_LINUX = 0, DISPLAY_BSD, DISPLAY_MRTG, DISPLAY_PLAIN } display_mode_type; typedef enum { REPEAT_NONE = 0, REPEAT_ONCE, REPEAT_FOREVER } repeat_mode_type; typedef struct { char *name; stat_type type; void *stat; } stat_item; /* AIX: statgrab.c:63: error: 'stat' redeclared as different kind of symbol /usr/include/sys/stat.h:320: error: previous declaration of 'stat' was here */ stat_item *stat_items = NULL; int num_stats = 0; int alloc_stats = 0; #define INCREMENT_STATS 64 display_mode_type display_mode = DISPLAY_LINUX; repeat_mode_type repeat_mode = REPEAT_NONE; int repeat_time = 1; int use_cpu_percent = 0; int use_diffs = 0; long float_scale_factor = 0; long long bytes_scale_factor = 0; /* Exit with an error message. */ static void die(const char *s) { fprintf(stderr, "fatal: %s\n", s); exit(1); } static void sg_die(const char *prefix, int exit_code) { sg_error_details err_det; char *errmsg = NULL; sg_error errc; if( SG_ERROR_NONE != ( errc = sg_get_error_details(&err_det) ) ) { fprintf(stderr, "panic: can't get error details (%d, %s)\n", errc, sg_str_error(errc)); exit(exit_code); } if( NULL == sg_strperror(&errmsg, &err_det) ) { errc = sg_get_error(); fprintf(stderr, "panic: can't prepare error message (%d, %s)\n", errc, sg_str_error(errc)); exit(exit_code); } fprintf( stderr, "%s: %s\n", prefix, errmsg ); free( errmsg ); exit(exit_code); } /* Remove all the recorded stats. */ static void clear_stats(void) { int i; for (i = 0; i < num_stats; i++) free(stat_items[i].name); num_stats = 0; } /* Add a stat. The varargs make up the name, joined with dots; the name is terminated with a NULL. */ static void add_stat(stat_type type, void *stat, ...) { va_list ap; int len = 0; char *name, *p; /* Figure out how long the name will be, including dots and trailing \0. */ va_start(ap, stat); while (1) { const char *part = va_arg(ap, const char *); if (part == NULL) break; len += 1 + strlen(part); } va_end(ap); /* Paste the name together. */ name = malloc(len); if (name == NULL) die("out of memory"); p = name; va_start(ap, stat); while (1) { const char *part = va_arg(ap, const char *); int partlen; if (part == NULL) break; partlen = strlen(part); memcpy(p, part, partlen); /* Replace spaces and dots with underscores. */ while (partlen-- > 0) { if (*p == ' ' || *p == '.') *p = '_'; p++; } *p++ = '.'; } va_end(ap); *--p = '\0'; /* Stretch the stats array if necessary. */ if (num_stats >= alloc_stats) { alloc_stats += INCREMENT_STATS; stat_items = realloc(stat_items, alloc_stats * sizeof *stat_items); if (stat_items == NULL) die("out of memory"); } stat_items[num_stats].name = name; stat_items[num_stats].type = type; stat_items[num_stats].stat = stat; ++num_stats; } /* Compare two stats by name for qsort and bsearch. */ static int stats_compare(const void *a, const void *b) { return strcmp(((stat_item *)a)->name, ((stat_item *)b)->name); } /* Compare up to the length of the key for bsearch. */ static int stats_compare_prefix(const void *key, const void *item) { const char *kn = ((stat_item *)key)->name; const char *in = ((stat_item *)item)->name; return strncmp(kn, in, strlen(kn)); } static void populate_const(void) { static int zero = 0; /* Constants, for use with MRTG mode. */ add_stat(INT, &zero, "const", "0", NULL); } static void populate_cpu(void) { sg_cpu_stats *cpu_s; cpu_s = use_diffs ? sg_get_cpu_stats_diff(NULL) : sg_get_cpu_stats(NULL); if (use_cpu_percent) { sg_cpu_percent_source cps = use_diffs ? sg_last_diff_cpu_percent : sg_entire_cpu_percent; sg_cpu_percents *cpu_p = sg_get_cpu_percents_of(cps, NULL); if (cpu_p != NULL) { add_stat(DOUBLE, &cpu_p->user, "cpu", "user", NULL); add_stat(DOUBLE, &cpu_p->kernel, "cpu", "kernel", NULL); add_stat(DOUBLE, &cpu_p->idle, "cpu", "idle", NULL); add_stat(DOUBLE, &cpu_p->iowait, "cpu", "iowait", NULL); add_stat(DOUBLE, &cpu_p->swap, "cpu", "swap", NULL); add_stat(DOUBLE, &cpu_p->nice, "cpu", "nice", NULL); add_stat(TIME_T, &cpu_p->time_taken, "cpu", "time_taken", NULL); } } else { if (cpu_s != NULL) { add_stat(UNSIGNED_LONG_LONG, &cpu_s->user, "cpu", "user", NULL); add_stat(UNSIGNED_LONG_LONG, &cpu_s->kernel, "cpu", "kernel", NULL); add_stat(UNSIGNED_LONG_LONG, &cpu_s->idle, "cpu", "idle", NULL); add_stat(UNSIGNED_LONG_LONG, &cpu_s->iowait, "cpu", "iowait", NULL); add_stat(UNSIGNED_LONG_LONG, &cpu_s->swap, "cpu", "swap", NULL); add_stat(UNSIGNED_LONG_LONG, &cpu_s->nice, "cpu", "nice", NULL); add_stat(UNSIGNED_LONG_LONG, &cpu_s->total, "cpu", "total", NULL); add_stat(TIME_T, &cpu_s->systime, "cpu", "systime", NULL); } } if (cpu_s != NULL) { add_stat(UNSIGNED_LONG_LONG, &cpu_s->context_switches, "cpu", "ctxsw", NULL); add_stat(UNSIGNED_LONG_LONG, &cpu_s->voluntary_context_switches, "cpu", "vctxsw", NULL); add_stat(UNSIGNED_LONG_LONG, &cpu_s->involuntary_context_switches, "cpu", "nvctxsw", NULL); add_stat(UNSIGNED_LONG_LONG, &cpu_s->syscalls, "cpu", "syscalls", NULL); add_stat(UNSIGNED_LONG_LONG, &cpu_s->interrupts, "cpu", "intrs", NULL); add_stat(UNSIGNED_LONG_LONG, &cpu_s->soft_interrupts, "cpu", "softintrs", NULL); } } static void populate_mem(void) { sg_mem_stats *mem = sg_get_mem_stats(NULL); if (mem != NULL) { add_stat(BYTES, &mem->total, "mem", "total", NULL); add_stat(BYTES, &mem->free, "mem", "free", NULL); add_stat(BYTES, &mem->used, "mem", "used", NULL); add_stat(BYTES, &mem->cache, "mem", "cache", NULL); } } static void populate_load(void) { sg_load_stats *load = sg_get_load_stats(NULL); if (load != NULL) { add_stat(DOUBLE, &load->min1, "load", "min1", NULL); add_stat(DOUBLE, &load->min5, "load", "min5", NULL); add_stat(DOUBLE, &load->min15, "load", "min15", NULL); } } static void populate_user(void) { static size_t entries; static char *name_list = NULL; size_t name_list_length = 0, pos = 0; sg_user_stats *users = sg_get_user_stats(&entries); if (users != NULL) { size_t i; for (i = 0; i < entries; i++) { const char *name = users[i].login_name; const char *tty = users[i].device; name_list_length += strlen(name) + 1; add_stat(STRING, &users[i].login_name, "user", tty, "login_name", NULL); add_stat(STRING, &users[i].device, "user", tty, "tty", NULL); add_stat(STRING, &users[i].hostname, "user", tty, "from", NULL); add_stat(TIME_T, &users[i].login_time, "user", tty, "login_time", NULL); } name_list = realloc(name_list, name_list_length + 1); for (i = 0; i < entries; i++) { const char *name = users[i].login_name; strncpy(name_list + pos, name, strlen(name)); pos += strlen(name); name_list[pos] = ' '; pos ++; } if (entries != 0) { pos--; } name_list[pos] = '\0'; add_stat(INT, &entries, "user", "num", NULL); add_stat(STRING, &name_list, "user", "names", NULL); } } static void populate_swap(void) { sg_swap_stats *swap = sg_get_swap_stats(NULL); if (swap != NULL) { add_stat(BYTES, &swap->total, "swap", "total", NULL); add_stat(BYTES, &swap->used, "swap", "used", NULL); add_stat(BYTES, &swap->free, "swap", "free", NULL); } } #ifndef lengthof #define lengthof(x) (sizeof(x)/sizeof((x)[0])) #endif static const char *host_states[] = { "unknown", "physical host", "virtual machine (full virtualized)", "virtual machine (paravirtualized)", "hardware virtualization" }; static const char *unexpected_host_state = "unexpected state (libstatgrab too new)"; static void populate_general(void) { /* FIXME this should be renamed to host. */ sg_host_info *host = sg_get_host_info(NULL); if (host != NULL) { add_stat(STRING, &host->os_name, "general", "os_name", NULL); add_stat(STRING, &host->os_release, "general", "os_release", NULL); add_stat(STRING, &host->os_version, "general", "os_version", NULL); add_stat(STRING, &host->platform, "general", "platform", NULL); add_stat(STRING, &host->hostname, "general", "hostname", NULL); add_stat(UNSIGNED, &host->ncpus, "general", "ncpus", NULL); add_stat(UNSIGNED, &host->maxcpus, "general", "ncpus_cfg", NULL); add_stat(UNSIGNED, &host->bitwidth, "general", "bitwidth", NULL); add_stat(STRING, ((size_t)host->host_state) > (lengthof(host_states) - 1) ? &unexpected_host_state : &host_states[host->host_state], "general", "hoststate", NULL); add_stat(TIME_T, &host->uptime, "general", "uptime", NULL); } } static void populate_fs(void) { size_t n, i; sg_fs_stats *disk = sg_get_fs_stats(&n); if (disk != NULL) { for (i = 0; i < n; i++) { /* FIXME it'd be nicer if libstatgrab did this */ char *buf, *name, *p; const char *device = disk[i].device_name; if (strcmp(device, "/") == 0) device = "root"; buf = strdup(device); if (buf == NULL) die("out of memory"); name = buf; if (strlen(name) == 2 && name[1] == ':') name[1] = '\0'; if (strncmp(name, "/dev/", 5) == 0) name += 5; while ((p = strchr(name, '/')) != NULL) *p = '_'; add_stat(STRING, &disk[i].device_name, "fs", name, "device_name", NULL); add_stat(STRING, &disk[i].fs_type, "fs", name, "fs_type", NULL); add_stat(STRING, &disk[i].mnt_point, "fs", name, "mnt_point", NULL); add_stat(BYTES, &disk[i].size, "fs", name, "size", NULL); add_stat(BYTES, &disk[i].used, "fs", name, "used", NULL); add_stat(BYTES, &disk[i].avail, "fs", name, "avail", NULL); add_stat(UNSIGNED_LONG_LONG, &disk[i].total_inodes, "fs", name, "total_inodes", NULL); add_stat(UNSIGNED_LONG_LONG, &disk[i].used_inodes, "fs", name, "used_inodes", NULL); add_stat(UNSIGNED_LONG_LONG, &disk[i].free_inodes, "fs", name, "free_inodes", NULL); add_stat(UNSIGNED_LONG_LONG, &disk[i].avail_inodes, "fs", name, "avail_inodes", NULL); add_stat(BYTES, &disk[i].io_size, "fs", name, "io_size", NULL); add_stat(BYTES, &disk[i].block_size, "fs", name, "block_size", NULL); add_stat(UNSIGNED_LONG_LONG, &disk[i].total_blocks, "fs", name, "total_blocks", NULL); add_stat(UNSIGNED_LONG_LONG, &disk[i].free_blocks, "fs", name, "free_blocks", NULL); add_stat(UNSIGNED_LONG_LONG, &disk[i].avail_blocks, "fs", name, "avail_blocks", NULL); add_stat(UNSIGNED_LONG_LONG, &disk[i].used_blocks, "fs", name, "used_blocks", NULL); free(buf); } } } static void populate_disk(void) { size_t n, i; sg_disk_io_stats *diskio; diskio = use_diffs ? sg_get_disk_io_stats_diff(&n) : sg_get_disk_io_stats(&n); if (diskio != NULL) { for (i = 0; i < n; i++) { const char *name = diskio[i].disk_name; add_stat(STRING, &diskio[i].disk_name, "disk", name, "disk_name", NULL); add_stat(BYTES, &diskio[i].read_bytes, "disk", name, "read_bytes", NULL); add_stat(BYTES, &diskio[i].write_bytes, "disk", name, "write_bytes", NULL); add_stat(TIME_T, &diskio[i].systime, "disk", name, "systime", NULL); } } } static void populate_proc(void) { /* FIXME expose individual process info too */ sg_process_count *proc = sg_get_process_count(); if (proc != NULL) { add_stat(UNSIGNED_LONG_LONG, &proc->total, "proc", "total", NULL); add_stat(UNSIGNED_LONG_LONG, &proc->running, "proc", "running", NULL); add_stat(UNSIGNED_LONG_LONG, &proc->sleeping, "proc", "sleeping", NULL); add_stat(UNSIGNED_LONG_LONG, &proc->stopped, "proc", "stopped", NULL); add_stat(UNSIGNED_LONG_LONG, &proc->zombie, "proc", "zombie", NULL); } else { char *errbuf; sg_error_details errdet; if( SG_ERROR_NONE != sg_get_error_details(&errdet) ) return; if( NULL == sg_strperror( &errbuf, &errdet ) ) return; fprintf( stderr, "%s\n", errbuf ); } } static void populate_net(void) { size_t num_io, num_iface, i; sg_network_io_stats *io; sg_network_iface_stats *iface; io = use_diffs ? sg_get_network_io_stats_diff(&num_io) : sg_get_network_io_stats(&num_io); if (io != NULL) { for (i = 0; i < num_io; i++) { const char *name = io[i].interface_name; add_stat(STRING, &io[i].interface_name, "net", name, "interface_name", NULL); add_stat(BYTES, &io[i].tx, "net", name, "tx", NULL); add_stat(BYTES, &io[i].rx, "net", name, "rx", NULL); add_stat(UNSIGNED_LONG_LONG, &io[i].ipackets, "net", name, "ipackets", NULL); add_stat(UNSIGNED_LONG_LONG, &io[i].opackets, "net", name, "opackets", NULL); add_stat(UNSIGNED_LONG_LONG, &io[i].ierrors, "net", name, "ierrors", NULL); add_stat(UNSIGNED_LONG_LONG, &io[i].oerrors, "net", name, "oerrors", NULL); add_stat(UNSIGNED_LONG_LONG, &io[i].collisions, "net", name, "collisions", NULL); add_stat(TIME_T, &io[i].systime, "net", name, "systime", NULL); } } iface = sg_get_network_iface_stats(&num_iface); if (iface != NULL) { for (i = 0; i < num_iface; i++) { const char *name = iface[i].interface_name; int had_io = 0; size_t j; /* If there wasn't a corresponding io stat, add interface_name from here. */ if (io != NULL) { for (j = 0; j < num_io; j++) { if (strcmp(io[j].interface_name, name) == 0) { had_io = 1; break; } } } if (!had_io) { add_stat(STRING, &iface[i].interface_name, "net", name, "interface_name", NULL); } add_stat(UNSIGNED_LONG_LONG, &iface[i].speed, "net", name, "speed", NULL); add_stat(BOOL, &iface[i].up, "net", name, "up", NULL); add_stat(DUPLEX, &iface[i].duplex, "net", name, "duplex", NULL); } } } static void populate_page(void) { sg_page_stats *page; page = use_diffs ? sg_get_page_stats_diff(NULL) : sg_get_page_stats(NULL); if (page != NULL) { add_stat(UNSIGNED_LONG_LONG, &page->pages_pagein, "page", "in", NULL); add_stat(UNSIGNED_LONG_LONG, &page->pages_pageout, "page", "out", NULL); add_stat(TIME_T, &page->systime, "page", "systime", NULL); } } typedef struct { const char *name; void (*populate)(); int interesting; } toplevel; toplevel toplevels[] = { {"const.", populate_const, 0}, {"cpu.", populate_cpu, 0}, {"mem.", populate_mem, 0}, {"load.", populate_load, 0}, {"user.", populate_user, 0}, {"swap.", populate_swap, 0}, {"general.", populate_general, 0}, {"fs.", populate_fs, 0}, {"disk.", populate_disk, 0}, {"proc.", populate_proc, 0}, {"net.", populate_net, 0}, {"page.", populate_page, 0}, {NULL, NULL, 0} }; /* Set the "interesting" flag on the sections that we actually need to fetch. */ static void select_interesting(int argc, char **argv) { toplevel *t; if (argc == 0) { for (t = &toplevels[0]; t->name != NULL; t++) t->interesting = 1; } else { int i; for (i = 0; i < argc; i++) { for (t = &toplevels[0]; t->name != NULL; t++) { if (strncmp(argv[i], t->name, strlen(t->name)) == 0) { t->interesting = 1; break; } } } } } /* Clear and rebuild the stat_items array. */ static void get_stats(void) { toplevel *t; clear_stats(); for (t = &toplevels[0]; t->name != NULL; t++) { if (t->interesting) t->populate(); } if (stat_items != NULL) qsort(stat_items, num_stats, sizeof *stat_items, stats_compare); } /* Print the value of a stat_item. */ static void print_stat_value(const stat_item *s) { void *pv = s->stat; union { double f; long l; unsigned long ul; long long ll; unsigned long long ull; } v; switch (s->type) { case LONG_LONG: #ifdef WIN32 /* Windows printf does not understand %lld, so use %I64d instead */ printf("%I64d", *(long long *)pv); #else printf("%lld", *(long long *)pv); #endif break; case UNSIGNED_LONG_LONG: #ifdef WIN32 /* Windows printf does not understand %llu, so use %I64u instead */ printf("%I64u", *(unsigned long long *)pv); #else printf("%llu", *(unsigned long long *)pv); #endif break; case BYTES: v.ull = *(unsigned long long *)pv; if (bytes_scale_factor != 0) { v.ull >>= (bytes_scale_factor-1); ++v.ull; v.ull >>= 1; } #ifdef WIN32 printf("%I64u", v.ull); #else printf("%llu", v.ull); #endif break; case TIME_T: /* FIXME option for formatted time? */ v.l = *(time_t *)pv; printf("%ld", v.l); break; case FLOAT: case DOUBLE: if (s->type == FLOAT) { v.f = *(float *)pv; } else { v.f = *(double *)pv; } if (float_scale_factor != 0) { printf("%ld", (long)(float_scale_factor * v.f)); } else { printf("%f", v.f); } break; case STRING: /* FIXME escaping? */ printf("%s", *(char **)pv); break; case INT: printf("%d", *(int *)pv); break; case UNSIGNED: printf("%u", *(unsigned *)pv); break; case BOOL: printf("%s", *(int *)pv ? "true" : "false"); break; case DUPLEX: switch (*(sg_iface_duplex *) pv) { case SG_IFACE_DUPLEX_FULL: printf("full"); break; case SG_IFACE_DUPLEX_HALF: printf("half"); break; default: printf("unknown"); break; } break; } } /* Print the name and value of a stat. */ static void print_stat(const stat_item *s) { switch (display_mode) { case DISPLAY_LINUX: printf("%s = ", s->name); break; case DISPLAY_BSD: printf("%s: ", s->name); break; case DISPLAY_MRTG: case DISPLAY_PLAIN: break; } print_stat_value(s); printf("\n"); } /* Print stats as specified on the provided command line. */ static void print_stats(int argc, char **argv) { int i; if (argc == optind) { /* Print all stats. */ for (i = 0; i < num_stats; i++) print_stat(&stat_items[i]); } else { /* Print selected stats. */ for (i = optind; i < argc; i++) { char *name = argv[i]; stat_item key; const stat_item *s, *end; int (*compare)(const void *, const void *); key.name = name; if (name[strlen(name) - 1] == '.') compare = stats_compare_prefix; else compare = stats_compare; if (stat_items == NULL) { s = NULL; } else { s = (const stat_item *)bsearch(&key, stat_items, num_stats, sizeof *stat_items, compare); } if (s == NULL) { fprintf(stderr, "Unknown stat %s\n", name); continue; } /* Find the range of stats the user wanted. */ for (; s >= stat_items; s--) { if (compare(&key, s) != 0) break; } s++; for (end = s; end < &stat_items[num_stats]; end++) { if (compare(&key, end) != 0) break; } /* And print them. */ for (; s < end; s++) { print_stat(s); } } } } static void usage(void) { printf("Usage: statgrab [OPTION]... [STAT]...\n" "Display system statistics.\n" "\n" "If no STATs are given, all will be displayed. Specify 'STAT.' to display all\n" "statistics starting with that prefix.\n" "\n"); printf(" -l Linux sysctl-style output (default)\n" " -b BSD sysctl-style output\n" " -m MRTG-compatible output\n" " -u Plain output (only show values)\n" " -n Display cumulative stats once (default)\n" " -s Display stat differences repeatedly\n" " -o Display stat differences once\n" " -t DELAY When repeating, wait DELAY seconds between updates (default 1)\n" " -p Display CPU usage differences as percentages rather than\n" " absolute values\n" " -f FACTOR Display floating-point values as integers scaled by FACTOR\n" " -F fs-list List of file systems (!) to show\n" " -K Display byte counts in kibibytes\n" " -M Display byte counts in mebibytes\n" " -G Display byte counts in gibibytes\n" "\n"); printf("Version %s - report bugs to <%s>.\n", PACKAGE_VERSION, PACKAGE_BUGREPORT); exit(1); } #ifndef HAVE_STRNDUP static char * strndup(char const *s, size_t n) { char *r = malloc(n + 1); char *d = r; if(!r) return r; while((n-- != 0) && *s) *d++ = *s++; *d = 0; return r; } #endif #define STACK_UNIT 4 static char const ** push_item(char const **stack, char const *item, size_t items) { char const **s = stack; size_t stack_size = items; size_t desired = (items / STACK_UNIT) * STACK_UNIT; if (desired < ++items) { desired = ((items / STACK_UNIT) + 1) * STACK_UNIT; if (desired >= stack_size) { s = realloc(stack, desired * sizeof(stack[0])); if(NULL == s) die("Out of memory"); } } s[stack_size] = item; return s; } static int sg_is_spc(char ch) { unsigned char uch = (unsigned char)ch; int i = (int)((unsigned)uch); return isspace(i); } static char const ** split_list(char const *list) { char const *l = list; char const **sp = NULL; size_t items = 0; for(l = list; *l; ) { while(*l && !(sg_is_spc(*l) || (',' == *l))) ++l; sp = push_item(sp, strndup(list, l-list), items++); while(*l && (sg_is_spc(*l) || (',' == *l))) ++l; list = l; } sp = push_item(sp, NULL, items); return sp; } static int fsnmcmp(const void *va, const void *vb) { const char *a = * (char * const *)va; const char *b = * (char * const *)vb; if( a && b ) return strcasecmp(a, b); /* force NULL sorted at end */ if( a && !b ) return -1; if( !a && b ) return 1; return 0; } static sg_error set_valid_filesystems(char const *fslist) { char const **newfs; char const **given_fs; while(sg_is_spc(*fslist)) ++fslist; if('!' == *fslist) { size_t new_items = 0, given_items = 0; const char **old_valid_fs = sg_get_valid_filesystems(0); if( NULL == old_valid_fs ) sg_die("sg_get_valid_filesystems()", 1); ++fslist; while(*fslist && sg_is_spc(*fslist)) ++fslist; given_fs = split_list(fslist); for(newfs = given_fs; *newfs; ++newfs) { ++given_items; } qsort(given_fs, given_items, sizeof(given_fs[0]), fsnmcmp); newfs = NULL; new_items = 0; while(*old_valid_fs) { if (NULL == bsearch(old_valid_fs, given_fs, given_items, sizeof(given_fs[0]), fsnmcmp)) { newfs = push_item(newfs, *old_valid_fs, new_items++); } ++old_valid_fs; } newfs = push_item(newfs, NULL, new_items); } else { newfs = given_fs = split_list(fslist); } if( SG_ERROR_NONE != sg_set_valid_filesystems( newfs ) ) sg_die("sg_set_valid_filesystems() failed", 1); for(newfs = given_fs; *newfs; ++newfs) { free((void *)(*newfs)); } return SG_ERROR_NONE; } int main(int argc, char **argv) { char *fslist = NULL; opterr = 0; while (1) { int c = getopt(argc, argv, "lbmunsot:pf:F:KMG"); if (c == -1) break; switch (c) { case 'l': display_mode = DISPLAY_LINUX; break; case 'b': display_mode = DISPLAY_BSD; break; case 'm': display_mode = DISPLAY_MRTG; break; case 'u': display_mode = DISPLAY_PLAIN; break; case 'n': repeat_mode = REPEAT_NONE; break; case 's': repeat_mode = REPEAT_FOREVER; break; case 'o': repeat_mode = REPEAT_ONCE; break; case 't': repeat_time = atoi(optarg); break; case 'p': use_cpu_percent = 1; break; case 'f': float_scale_factor = atol(optarg); break; case 'F': free(fslist); fslist = strdup(optarg); break; case 'K': bytes_scale_factor = 10; break; case 'M': bytes_scale_factor = 20; break; case 'G': bytes_scale_factor = 30; break; default: usage(); } } if (display_mode == DISPLAY_MRTG) { if ((argc - optind) != 2) die("mrtg mode: must specify exactly two stats"); if (repeat_mode == REPEAT_FOREVER) die("mrtg mode: cannot repeat display"); } /* if (use_cpu_percent && repeat_mode == REPEAT_NONE) die("CPU percentage usage display requires stat differences"); */ if (repeat_mode == REPEAT_NONE) use_diffs = 0; else use_diffs = 1; select_interesting(argc - optind, &argv[optind]); sg_log_init("statgrab", "STATGRAB_LOG_PROPERTIES", argc ? argv[0] : NULL); /* We don't care if sg_init fails, because we can just display the statistics that can be read as non-root. */ sg_init(1); sg_snapshot(); if (sg_drop_privileges() != 0) die("Failed to drop setuid/setgid privileges"); if (fslist) { sg_error rc = set_valid_filesystems(fslist); if(rc != SG_ERROR_NONE) die(sg_str_error(rc)); free(fslist); } else { sg_error rc = set_valid_filesystems("!nfs, nfs3, nfs4, cifs, smbfs, samba, autofs"); if(rc != SG_ERROR_NONE) die(sg_str_error(rc)); } switch (repeat_mode) { case REPEAT_NONE: get_stats(); print_stats(argc, argv); break; case REPEAT_ONCE: get_stats(); sleep(repeat_time); sg_snapshot(); get_stats(); print_stats(argc, argv); break; case REPEAT_FOREVER: while (1) { get_stats(); print_stats(argc, argv); printf("\n"); sleep(repeat_time); sg_snapshot(); } } if (display_mode == DISPLAY_MRTG) { printf("\n"); printf("statgrab\n"); } sg_shutdown(); return 0; } libstatgrab-0.90/src/statgrab/Makefile.in000644 001750 001750 00000054122 12200045540 020353 0ustar00tdbusers000000 000000 # Makefile.in generated by automake 1.12.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile for libstatgrab/src/statgrab # http://www.i-scream.org/libstatgrab/ # $Id$ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @STATGRAB_TRUE@bin_PROGRAMS = statgrab$(EXEEXT) subdir = src/statgrab DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/statgrab-make-mrtg-config.in \ $(srcdir)/statgrab-make-mrtg-index.in $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_lib.m4 \ $(top_srcdir)/m4/ax_ncurses.m4 $(top_srcdir)/m4/ax_perl5.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_shellvars.m4 $(top_srcdir)/m4/ax_types.m4 \ $(top_srcdir)/m4/ax_visibility.m4 $(top_srcdir)/m4/ax_win32.m4 \ $(top_srcdir)/m4/ax_xopen.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = statgrab-make-mrtg-config \ statgrab-make-mrtg-index CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_statgrab_OBJECTS = statgrab.$(OBJEXT) statgrab_OBJECTS = $(am_statgrab_OBJECTS) statgrab_LDADD = $(LDADD) statgrab_DEPENDENCIES = \ $(top_builddir)/src/libstatgrab/libstatgrab.la am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } SCRIPTS = $(bin_SCRIPTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(statgrab_SOURCES) DIST_SOURCES = $(statgrab_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIN_GROUP = @BIN_GROUP@ BIN_OWNER = @BIN_OWNER@ BIN_PERM = @BIN_PERM@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CLIBFLAGS = @CLIBFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOCBOOK2MAN = @DOCBOOK2MAN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ HAVE_LIBLOG4CPLUS = @HAVE_LIBLOG4CPLUS@ INC_LOG4CPLUS = @INC_LOG4CPLUS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBS_LOG4CPLUS = @LIBS_LOG4CPLUS@ LIBTOOL = @LIBTOOL@ LINKFLAGS = @LINKFLAGS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL5 = @PERL5@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SAIDARCPPFLAGS = @SAIDARCPPFLAGS@ SAIDARLIBS = @SAIDARLIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SG_EXPORT = @SG_EXPORT@ SG_IMPORT = @SG_IMPORT@ SG_PRIVATE = @SG_PRIVATE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_LIBLOG4CPLUS = @WITH_LIBLOG4CPLUS@ WITH_THREADS_CONFIGURED = @WITH_THREADS_CONFIGURED@ WITH_VISIBILITY_SUPPORT = @WITH_VISIBILITY_SUPPORT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log4cplus_CFLAGS = @log4cplus_CFLAGS@ log4cplus_LIBS = @log4cplus_LIBS@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @STATGRAB_TRUE@bin_SCRIPTS = statgrab-make-mrtg-config statgrab-make-mrtg-index statgrab_SOURCES = statgrab.c AM_CPPFLAGS = -I$(top_srcdir) -I$(top_builddir) \ -I$(top_srcdir)/src -I$(top_builddir)/src \ -I$(top_srcdir)/src/libstatgrab -I$(top_builddir)/src/libstatgrab \ @CLIBFLAGS@ LDADD = $(top_builddir)/src/libstatgrab/libstatgrab.la @LINKFLAGS@ all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/statgrab/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/statgrab/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): statgrab-make-mrtg-config: $(top_builddir)/config.status $(srcdir)/statgrab-make-mrtg-config.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ statgrab-make-mrtg-index: $(top_builddir)/config.status $(srcdir)/statgrab-make-mrtg-index.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list statgrab$(EXEEXT): $(statgrab_OBJECTS) $(statgrab_DEPENDENCIES) $(EXTRA_statgrab_DEPENDENCIES) @rm -f statgrab$(EXEEXT) $(LINK) $(statgrab_OBJECTS) $(statgrab_LDADD) $(LIBS) install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/statgrab.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(SCRIPTS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-binSCRIPTS \ install-exec-local install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool cscopelist ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-binPROGRAMS install-binSCRIPTS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-exec-local install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-binSCRIPTS install-exec-local: # Some operating systems need the binary to be setgid kmem @SETGIDBINS_TRUE@@STATGRAB_TRUE@ chgrp kmem $(DESTDIR)@bindir@/statgrab @SETGIDBINS_TRUE@@STATGRAB_TRUE@ chmod g+s $(DESTDIR)@bindir@/statgrab # Some operating systems need the binary to be setuid root @SETUIDBINS_TRUE@@STATGRAB_TRUE@ chown root $(DESTDIR)@bindir@/statgrab @SETUIDBINS_TRUE@@STATGRAB_TRUE@ chmod u+s $(DESTDIR)@bindir@/statgrab # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libstatgrab-0.90/src/statgrab/Makefile.am000644 001750 001750 00000001541 12200025312 020332 0ustar00tdbusers000000 000000 # Makefile for libstatgrab/src/statgrab # http://www.i-scream.org/libstatgrab/ # $Id$ if STATGRAB bin_PROGRAMS = statgrab bin_SCRIPTS = statgrab-make-mrtg-config statgrab-make-mrtg-index endif statgrab_SOURCES = statgrab.c AM_CPPFLAGS = -I$(top_srcdir) -I$(top_builddir) \ -I$(top_srcdir)/src -I$(top_builddir)/src \ -I$(top_srcdir)/src/libstatgrab -I$(top_builddir)/src/libstatgrab \ @CLIBFLAGS@ LDADD = $(top_builddir)/src/libstatgrab/libstatgrab.la @LINKFLAGS@ install-exec-local: if STATGRAB if SETGIDBINS # Some operating systems need the binary to be setgid kmem chgrp kmem $(DESTDIR)@bindir@/statgrab chmod g+s $(DESTDIR)@bindir@/statgrab endif if SETUIDBINS # Some operating systems need the binary to be setuid root chown root $(DESTDIR)@bindir@/statgrab chmod u+s $(DESTDIR)@bindir@/statgrab endif endif libstatgrab-0.90/src/statgrab/statgrab-make-mrtg-index.in000755 001750 001750 00000004442 12200025312 023432 0ustar00tdbusers000000 000000 #!/usr/bin/perl -w # i-scream libstatgrab # http://www.i-scream.org # Copyright (C) 2000-2013 i-scream # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # $Id$ use strict; use Getopt::Long; my $progname = "statgrab-make-mrtg-config"; my $package_version = '@PACKAGE_VERSION@'; my $package_bugreport = '@PACKAGE_BUGREPORT@'; my $help_text = < \$pagetitle, 'help' => \my $help) or die $help_text; if ($help) { print "$help_text"; exit 0; } my %pages = (); while (<>) { /^Title\[([^\]]+)\]: (.*)$/ or next; $pages{$2} = $1; } print < $pagetitle

$pagetitle

EOF foreach my $title (sort keys %pages) { my $page = $pages{$title}; print "

$title

\n"; print "

\"$page\"

\n"; } print <Generated by libstatgrab version $package_version.

EOF } main(); libstatgrab-0.90/src/statgrab/statgrab-make-mrtg-config.in000755 001750 001750 00000015601 12200025312 023567 0ustar00tdbusers000000 000000 #!/usr/bin/perl -w # i-scream libstatgrab # http://www.i-scream.org # Copyright (C) 2000-2013 i-scream # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # $Id$ use strict; use Getopt::Long; my $progname = "statgrab-make-mrtg-config"; my $statgrab = "statgrab"; my $workdir = undef; my $kib = 1024; my $mib = $kib * $kib; # Type 0 is plain integers. my $KIBIBYTES = 1; my $PERCENT = 2; my $FLOAT = 3; # Print an entry in the MRTG config file. sub entry ($$$$$$$$$$) { my ($title, $vali, $valo, $max, $ylegend, $yunit, $legendi, $legendo, $gauge, $type) = @_; my $name = $vali; my $options = ""; $options .= " noo" unless defined $valo; $options .= " gauge" if $gauge; my $sgoptions = ""; $sgoptions .= " -o -p" if $type == $PERCENT; $sgoptions .= " -f 1000" if $type == $FLOAT; print "\n"; print "Title[$name]: $title\n"; print "PageTop[$name]: $title\n"; print "MaxBytes[$name]: $max\n"; print "YLegend[$name]: $ylegend\n"; print "ShortLegend[$name]: $yunit\n"; print "LegendI[$name]: $legendi\n"; print "LegendO[$name]: $legendo\n" if defined $valo; if ($type == $KIBIBYTES) { print "kMG[$name]: Ki,Mi,Gi,Ti\n"; $sgoptions .= " -K"; } $valo = "const.0" unless defined $valo; print "Options[$name]:$options\n" if $options ne ""; print "Target[$name]: `$statgrab$sgoptions -m $vali $valo`\n"; } my $package_version = '@PACKAGE_VERSION@'; my $package_bugreport = '@PACKAGE_BUGREPORT@'; my $help_text = < \$statgrab, 'workdir=s' => \$workdir, 'no-header' => \my $no_header, 'help' => \my $help) or die $help_text; if ($help) { print "$help_text"; exit 0; } unless ($no_header or defined $workdir) { fatal "must specify --workdir or --no-header" } my %stats = (); my %toplevel = (); my %disks = (); my %fss = (); my %nets = (); open STATGRAB, "$statgrab|" or fatal "can't run statgrab"; while () { chomp; /^([^=]*) = (.*)$/ or fatal "bad line in statgrab output"; $stats{$1} = $2; my @parts = split /\./, $1; $toplevel{$parts[0]} = 1; $disks{$parts[1]} = 1 if $parts[0] eq "disk"; $fss{$parts[1]} = 1 if $parts[0] eq "fs"; $nets{$parts[1]} = 1 if $parts[0] eq "net"; } close STATGRAB; unless ($no_header) { print "WorkDir: $workdir\n"; print "Options[^]: growright\n"; print "WriteExpires: Yes\n"; } if (exists $toplevel{"cpu"}) { entry("CPU idle", "cpu.idle", undef, "100", "Idle", "%", "idle", undef, 1, $PERCENT); entry("CPU iowait", "cpu.iowait", undef, "100", "iowait", "%", "iowait", undef, 1, $PERCENT); entry("CPU kernel", "cpu.kernel", undef, "100", "Kernel", "%", "kernel", undef, 1, $PERCENT); entry("CPU nice", "cpu.nice", undef, "100", "Nice", "%", "nice", undef, 1, $PERCENT); entry("CPU swap", "cpu.swap", undef, "100", "Swap", "%", "swap", undef, 1, $PERCENT); entry("CPU user", "cpu.user", undef, "100", "User", "%", "user", undef, 1, $PERCENT); } foreach my $disk (sort keys %disks) { my $name = $stats{"disk.$disk.disk_name"}; entry("Disk $name IO", "disk.$disk.read_bytes", "disk.$disk.write_bytes", 100*$mib, "IO rate", "KiB/s", "read", "write", 0, $KIBIBYTES); } foreach my $fs (sort keys %fss) { my $name = $stats{"fs.$fs.mnt_point"}; my $size = $stats{"fs.$fs.size"}; my $inodes = $stats{"fs.$fs.total_inodes"}; entry("Filesystem $name space usage", "fs.$fs.used", undef, $size, "Space used", "KiB", "used", undef, 1, $KIBIBYTES); entry("Filesystem $name inode usage", "fs.$fs.used_inodes", undef, $inodes, "Inodes used", "inodes", "used", undef, 1, 0); } if (exists $toplevel{"load"}) { entry("Load average over 1 minute", "load.min1", undef, 100, "Load average", "running * 1000", "load", undef, 1, $FLOAT); entry("Load average over 5 minutes", "load.min5", undef, 100, "Load average", "running * 1000", "load", undef, 1, $FLOAT); entry("Load average over 15 minutes", "load.min15", undef, 100, "Load average", "running * 1000", "load", undef, 1, $FLOAT); } if (exists $toplevel{"mem"}) { my $total = $stats{"mem.total"}; entry("Memory usage", "mem.used", "mem.cache", $total, "Memory usage", "KiB", "total", "cache", 1, $KIBIBYTES); } foreach my $net (sort keys %nets) { my $name = $stats{"net.$net.interface_name"}; my $speed = int($stats{"net.$net.speed"}); $speed = 100 if $speed == 0; # The speed is reported in Mbit/s; we want KiB/s. $speed = int(($speed * 1000000) / (8 * $kib)); entry("Network interface $name IO", "net.$net.rx", "net.$net.tx", $speed, "Network IO", "KiB/s", "rx", "tx", 0, $KIBIBYTES); } if (exists $toplevel{"page"}) { # FIXME what's a sensible maximum? entry("Paging IO", "page.in", "page.out", 1000, "Paging IO", "pages", "in", "out", 0, 0); } if (exists $toplevel{"proc"}) { # FIXME mildly silly assumption my $maxproc = 65536; entry("Processes running", "proc.running", undef, $maxproc, "Running", "procs", "running", undef, 1, 0); entry("Processes sleeping", "proc.sleeping", undef, $maxproc, "Sleeping", "procs", "running", undef, 1, 0); entry("Processes stopped", "proc.stopped", undef, $maxproc, "Stopped", "procs", "running", undef, 1, 0); entry("Processes", "proc.total", undef, $maxproc, "Total", "procs", "running", undef, 1, 0); entry("Processes zombie", "proc.zombie", undef, $maxproc, "Zombie", "procs", "running", undef, 1, 0); } if (exists $toplevel{"swap"}) { my $swapsize = $stats{"swap.total"}; if ($swapsize ne "0") { entry("Swap usage", "swap.used", undef, $swapsize, "Swap usage", "KiB", "used", undef, 1, $KIBIBYTES); } } if (exists $toplevel{"user"}) { entry("Users", "user.num", undef, 1000, "Users", "users", "users", undef, 1, 0); } } main(); libstatgrab-0.90/src/libstatgrab/trace.h000644 001750 001750 00000016507 12200025312 020244 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #ifndef STATGRAB_TRACE_H #define STATGRAB_TRACE_H /* * following __VA_ARGS__ helpers are taken * from http://stackoverflow.com/questions/5588855/standard-alternative-to-gccs-va-args-trick * * Thanks, Richard Hansen */ /* expands to the first argument */ #define FIRST(...) FIRST_HELPER(__VA_ARGS__, throwaway) #define FIRST_HELPER(first, ...) first /* * if there's only one argument, expands to nothing. if there is more * than one argument, expands to a comma followed by everything but * the first argument. only supports up to 9 arguments but can be * trivially expanded. */ #define REST(...) REST_HELPER(NUM(__VA_ARGS__), __VA_ARGS__) #define REST_HELPER(qty, ...) REST_HELPER2(qty, __VA_ARGS__) #define REST_HELPER2(qty, ...) REST_HELPER_##qty(__VA_ARGS__) #define REST_HELPER_ONE(first) #define REST_HELPER_TWOORMORE(first, ...) , __VA_ARGS__ #define NUM(...) \ SELECT_10TH(__VA_ARGS__, TWOORMORE, TWOORMORE, TWOORMORE, TWOORMORE,\ TWOORMORE, TWOORMORE, TWOORMORE, TWOORMORE, ONE, throwaway) #define SELECT_10TH(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, ...) a10 #if defined(WITH_LIBLOG4CPLUS) #include #define LOGMSG(module, ll, msg) log4cplus_logger_log(LOG4CPLUS_TEXT("statgrab." module), ll, msg) #define LOGMSG_FMT(module, ll, ...) log4cplus_logger_log(LOG4CPLUS_TEXT("statgrab." module), ll, __VA_ARGS__ ) #define PANIC_LOG(module, msg) do { \ log4cplus_logger_log(LOG4CPLUS_TEXT("statgrab." module), L4CP_FATAL_LOG_LEVEL, msg " (at %s:%d)", __FILE__, __LINE__); \ exit(255); \ } while(0) #define PANIC_LOG_FMT(module, ...) do { \ log4cplus_logger_log(LOG4CPLUS_TEXT("statgrab." module), L4CP_FATAL_LOG_LEVEL, FIRST(__VA_ARGS__) " (at %s:%d)" REST(__VA_ARGS__), __FILE__, __LINE__); \ exit(255); \ } while(0) #define ERROR_LOG(module, msg) do { \ log4cplus_logger_log(LOG4CPLUS_TEXT("statgrab." module), L4CP_ERROR_LOG_LEVEL, msg " (at %s:%d)", __FILE__, __LINE__); \ } while(0) #define ERROR_LOG_FMT(module, ...) do { \ log4cplus_logger_log(LOG4CPLUS_TEXT("statgrab." module), L4CP_ERROR_LOG_LEVEL, FIRST(__VA_ARGS__) " (at %s:%d)" REST(__VA_ARGS__), __FILE__, __LINE__); \ } while(0) #define WARN_LOG(module, msg) do { \ log4cplus_logger_log(LOG4CPLUS_TEXT("statgrab." module), L4CP_WARN_LOG_LEVEL, msg " (at %s:%d)", __FILE__, __LINE__); \ } while(0) #define WARN_LOG_FMT(module, ...) do { \ log4cplus_logger_log(LOG4CPLUS_TEXT("statgrab." module), L4CP_WARN_LOG_LEVEL, FIRST(__VA_ARGS__) " (at %s:%d)" REST(__VA_ARGS__), __FILE__, __LINE__); \ } while(0) #define INFO_LOG(module, msg) do { \ log4cplus_logger_log(LOG4CPLUS_TEXT("statgrab." module), L4CP_INFO_LOG_LEVEL, msg " (at %s:%d)", __FILE__, __LINE__); \ } while(0) #define INFO_LOG_FMT(module, ...) do { \ log4cplus_logger_log(LOG4CPLUS_TEXT("statgrab." module), L4CP_INFO_LOG_LEVEL, FIRST(__VA_ARGS__) " (at %s:%d)" REST(__VA_ARGS__), __FILE__, __LINE__); \ } while(0) #define DEBUG_LOG(module, msg) do { \ log4cplus_logger_log(LOG4CPLUS_TEXT("statgrab." module), L4CP_DEBUG_LOG_LEVEL, msg " (at %s:%d)", __FILE__, __LINE__); \ } while(0) #define DEBUG_LOG_FMT(module, ...) do { \ log4cplus_logger_log(LOG4CPLUS_TEXT("statgrab." module), L4CP_DEBUG_LOG_LEVEL, FIRST(__VA_ARGS__) " (at %s:%d)" REST(__VA_ARGS__), __FILE__, __LINE__); \ } while(0) #define TRACE_LOG(module, msg) do { \ log4cplus_logger_log(LOG4CPLUS_TEXT("statgrab." module), L4CP_TRACE_LOG_LEVEL, msg " (at %s:%d)", __FILE__, __LINE__); \ } while(0) #define TRACE_LOG_FMT(module, ...) do { \ log4cplus_logger_log(LOG4CPLUS_TEXT("statgrab." module), L4CP_TRACE_LOG_LEVEL, FIRST(__VA_ARGS__) " (at %s:%d)" REST(__VA_ARGS__), __FILE__, __LINE__); \ } while(0) #elif defined(WITH_FULL_CONSOLE_LOGGER) #define LOGMSG(module, ll, msg) fprintf(stderr, "log%d: " msg " in statgrab." module " at %s:%d\n", ll, __FILE__, __LINE__) #define LOGMSG_FMT(module, ll, ...) fprintf(stderr, "log%d: " FIRST(__VA_ARGS__) " in statgrab." module " at %s:%d\n", ll REST(__VA_ARGS__), __FILE__, __LINE__) #define PANIC_LOG(module, msg) do { fprintf( stderr, "panic condition: " msg " in statgrab." module " at %s:%d", __FILE__, __LINE__); exit(255); } while(0) #define PANIC_LOG_FMT(module, ...) do { fprintf( stderr, "panic condition: " FIRST(__VA_ARGS__) " in statgrab." module " at %s:%d" REST(__VA_ARGS__), __FILE__, __LINE__); exit(255); } while(0) #define ERROR_LOG(module, msg) fprintf(stderr, "error: " msg " in statgrab." module " at %s:%d\n", __FILE__, __LINE__) #define ERROR_LOG_FMT(module, ...) fprintf(stderr, "error: " FIRST(__VA_ARGS__) " in statgrab." module " at %s:%d\n" REST(__VA_ARGS__), __FILE__, __LINE__) #define WARN_LOG(module, msg) fprintf(stderr, "warning: " msg " in statgrab." module " at %s:%d\n", __FILE__, __LINE__) #define WARN_LOG_FMT(module, ...) fprintf(stderr, "warning: " FIRST(__VA_ARGS__) " in statgrab." module " at %s:%d\n" REST(__VA_ARGS__), __FILE__, __LINE__) #define INFO_LOG(module, msg) fprintf(stderr, "info: " msg " in statgrab." module " at %s:%d\n", __FILE__, __LINE__) #define INFO_LOG_FMT(module, ...) fprintf(stderr, "info: " FIRST(__VA_ARGS__) " in statgrab." module " at %s:%d\n" REST(__VA_ARGS__), __FILE__, __LINE__) #define DEBUG_LOG(module, msg) fprintf(stderr, "debug: " msg " in statgrab." module " at %s:%d\n", __FILE__, __LINE__) #define DEBUG_LOG_FMT(module, ...) fprintf(stderr, "debug: " FIRST(__VA_ARGS__) " in statgrab." module " at %s:%d\n" REST(__VA_ARGS__), __FILE__, __LINE__) #define TRACE_LOG(module, msg) fprintf(stderr, "trace: " msg " in statgrab." module " at %s:%d\n", __FILE__, __LINE__) #define TRACE_LOG_FMT(module, ...) fprintf(stderr, "trace: " FIRST(__VA_ARGS__) " in statgrab." module " at %s:%d\n" REST(__VA_ARGS__), __FILE__, __LINE__) #else #define LOGMSG(module, ll, msg) ((void)0) #define LOGMSG_FMT(module, ll, ...) ((void)0) #define PANIC_LOG(module, msg) do { fprintf( stderr, "panic condition: " msg " in statgrab." module " at %s:%d", __FILE__, __LINE__); exit(255); } while(0) #define PANIC_LOG_FMT(module, ...) do { fprintf( stderr, "panic condition: " FIRST(__VA_ARGS__) " in statgrab." module " at %s:%d" REST(__VA_ARGS__), __FILE__, __LINE__); exit(255); } while(0) #define ERROR_LOG(module, msg) ((void)0) #define ERROR_LOG_FMT(module, ...) ((void)0) #define WARN_LOG(module, msg) ((void)0) #define WARN_LOG_FMT(module, ...) ((void)0) #define INFO_LOG(module, msg) ((void)0) #define INFO_LOG_FMT(module, ...) ((void)0) #define DEBUG_LOG(module, msg) ((void)0) #define DEBUG_LOG_FMT(module, ...) ((void)0) #define TRACE_LOG(module, msg) ((void)0) #define TRACE_LOG_FMT(module, ...) ((void)0) #endif #endif /* STATGRAB_TRACE_H */ libstatgrab-0.90/src/libstatgrab/error.h000644 001750 001750 00000005172 12200025312 020273 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #ifndef STATGRAB_ERROR_H #define STATGRAB_ERROR_H __sg_private void sg_clear_error(void); __sg_private sg_error sg_set_error_fmt(sg_error code, const char *arg, ...); __sg_private sg_error sg_set_error_with_errno_fmt(sg_error code, const char *arg, ...); __sg_private sg_error sg_set_error_with_errno_code_fmt(sg_error code, int errno_value, const char *arg, ...); #define SET_ERROR(comp, code, ...) \ do { \ char *__errinfobuf = NULL; \ sg_set_error_fmt(code, __VA_ARGS__); \ ERROR_LOG_FMT(comp, "%s:%d: %s", __FILE__, __LINE__, sg_strperror(&__errinfobuf, NULL)); \ free(__errinfobuf); \ } while(0) #define RETURN_WITH_SET_ERROR(comp, code, ...) SET_ERROR(comp, code, __VA_ARGS__); return code #define SET_ERROR_WITH_ERRNO(comp, code, ...) \ do { \ char *__errinfobuf = NULL; \ sg_set_error_with_errno_fmt(code, __VA_ARGS__); \ ERROR_LOG_FMT(comp, "%s:%d: %s", __FILE__, __LINE__, sg_strperror(&__errinfobuf, NULL)); \ free(__errinfobuf); \ } while(0) #define RETURN_WITH_SET_ERROR_WITH_ERRNO(comp, code, ...) SET_ERROR_WITH_ERRNO(comp, code, __VA_ARGS__); return code #define SET_ERROR_WITH_ERRNO_CODE(comp, code, errno_value, ...) \ do { \ char *__errinfobuf = NULL; \ sg_set_error_with_errno_code_fmt(code, errno_value, __VA_ARGS__); \ ERROR_LOG_FMT(comp, "%s:%d: %s", __FILE__, __LINE__, sg_strperror(&__errinfobuf, NULL)); \ free(__errinfobuf); \ } while(0) #define RETURN_WITH_SET_ERROR_WITH_ERRNO_CODE(comp, code, errno_value, ...) SET_ERROR_WITH_ERRNO_CODE(comp, code, errno_value, __VA_ARGS__); return code #define RETURN_FROM_PREVIOUS_ERROR(comp, code) \ do { \ char *__errinfobuf = NULL; \ ERROR_LOG_FMT(comp, "%s:%d: %s", __FILE__, __LINE__, sg_strperror(&__errinfobuf, NULL)); \ free(__errinfobuf); \ } while(0); return code #endif /* STATGRAB_ERROR_H */ libstatgrab-0.90/src/libstatgrab/win32.h000644 001750 001750 00000002301 12200025312 020073 0ustar00tdbusers000000 000000 #ifdef WIN32 typedef enum { SG_WIN32_PROC_USER, SG_WIN32_PROC_PRIV, SG_WIN32_PROC_IDLE, SG_WIN32_PROC_INT, SG_WIN32_MEM_CACHE, SG_WIN32_UPTIME, SG_WIN32_PAGEIN, SG_WIN32_PAGEOUT, SG_WIN32_SIZE /* Leave this as last entry */ } pdh_enum; #define PDH_USER "\\Processor(_Total)\\% User Time" #define PDH_PRIV "\\Processor(_Total)\\% Privileged Time" #define PDH_IDLE "\\Processor(_Total)\\% Processor Time" #define PDH_INTER "\\Processor(_Total)\\% Interrupt Time" #define PDH_DISKIOREAD "\\PhysicalDisk(%s)\\Disk Read Bytes/sec" #define PDH_DISKIOWRITE "\\PhysicalDisk(%s)\\Disk Write Bytes/sec" #define PDH_MEM_CACHE "\\Memory\\Cache Bytes" #define PDH_UPTIME "\\System\\System Up Time" #define PDH_PAGEIN "\\Memory\\Pages Input/sec" #define PDH_PAGEOUT "\\Memory\\Pages Output/sec" int add_counter(const char *fullCounterPath, HCOUNTER *phCounter); int read_counter_double(pdh_enum counter, double *result); int read_counter_large(pdh_enum counter, long long *result); char *get_diskio(const int no, long long *read, long long *write); int get_netio(const int no, char **name, long long *read, long long *write); int sg_win32_snapshot(); int sg_win32_start_capture(); void sg_win32_end_capture(); #endif libstatgrab-0.90/src/libstatgrab/os_info.c000644 001750 001750 00000042250 12200025312 020567 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #include "tools.h" /** * Note: values must be sorted, search will be done using bsearch */ #if defined(SOLARIS) #define GET_BITWIDTH_BY_ARCH_NAME static const char *isa32[] = { "i386", "sparc" }; static const char *isa64[] = { "amd64", "sparcv9" }; #elif defined(CTL_HW) && (defined(HW_MACHINE_ARCH)||defined(HW_MACHINE)) #define GET_BITWIDTH_BY_ARCH_NAME static const char *isa32[] = { "arm", "armeb", "hppa", "i386", "m68000", "m68k", "mips", "powerpc", "sh3el", "sh3eb", "sparc", "vax" }; static const char *isa64[] = { "alpha", "amd64", "hppa64", "ia64", "mips64", "mips64el", "sparc64", "x86_64" }; #endif #ifdef WIN32 #define WINDOWS2000 "Windows 2000" #define WINDOWSXP "Windows XP" #define WINDOWS2003 "Windows Server 2003" #define BUFSIZE 12 static int home_or_pro(const OSVERSIONINFOEX osinfo, char **name) { int r; if (osinfo.wSuiteMask & VER_SUITE_PERSONAL) { r = sg_concat_string(name, " Home Edition"); } else { r = sg_concat_string(name, " Professional"); } return r; } static char * get_os_name(const OSVERSIONINFOEX osinfo) { char *name; char tmp[10]; int r = 0; /* we only compile on 2k or newer, which is version 5 * Covers 2000, XP and 2003 */ if (osinfo.dwMajorVersion != 5) { return "Unknown"; } switch(osinfo.dwMinorVersion) { case 0: /* Windows 2000 */ name = strdup(WINDOWS2000); if(name == NULL) { goto out; } if (osinfo.wProductType == VER_NT_WORKSTATION) { r = home_or_pro(osinfo, &name); } else if (osinfo.wSuiteMask & VER_SUITE_DATACENTER) { r = sg_concat_string(&name, " Datacenter Server"); } else if (osinfo.wSuiteMask & VER_SUITE_ENTERPRISE) { r = sg_concat_string(&name, " Advanced Server"); } else { r = sg_concat_string(&name, " Server"); } break; case 1: /* Windows XP */ name = strdup(WINDOWSXP); if(name == NULL) { goto out; } r = home_or_pro(osinfo, &name); break; case 2: /* Windows 2003 */ /* XXX complete detection using http://msdn.microsoft.com/en-us/library/ms724833%28VS.85%29.aspx */ if( (osinfo.wProductType == VER_NT_WORKSTATION) && (sysinfo.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64) ) { name = strdup(WINDOWSXP); r = home_or_pro(osinfo, &name); r = sg_concat_string(&name, " x64 Edition"); } else { name = strdup(WINDOWS2003); } if(name == NULL) { goto out; } if (osinfo.wSuiteMask & VER_SUITE_DATACENTER) { r = sg_concat_string(&name, " Datacenter Edition"); } else if (osinfo.wSuiteMask & VER_SUITE_ENTERPRISE) { r = sg_concat_string(&name, " Enterprise Edition"); } else if (osinfo.wSuiteMask & VER_SUITE_BLADE) { r = sg_concat_string(&name, " Web Edition"); } else { r = sg_concat_string(&name, " Standard Edition"); } break; default: name = strdup("Windows 2000 based"); break; } if(r != 0) { free (name); return NULL; } /* Add on service pack version */ if (osinfo.wServicePackMajor != 0) { if(osinfo.wServicePackMinor == 0) { if(snprintf(tmp, sizeof(tmp), " SP%d", osinfo.wServicePackMajor) != -1) { r = sg_concat_string(&name, tmp); } } else { if(snprintf(tmp, sizeof(tmp), " SP%d.%d", osinfo.wServicePackMajor, osinfo.wServicePackMinor) != -1) { r = sg_concat_string(&name, tmp); } } if(r) { free(name); return NULL; } } return name; out: /* strdup failed */ sg_set_error_with_errno(SG_ERROR_MALLOC, NULL); ERROR_LOG("os", "get_os_name: strdup() failed"); return NULL; } #endif #ifdef GET_BITWIDTH_BY_ARCH_NAME static int cmp_arch_name(const void *va, const void *vb) { const char *a = * (char * const *)va; const char *b = * (char * const *)vb; size_t len, len_b; assert(a); assert(b); len = strlen(a); len_b = strlen(b); if( len_b < len ) len = len_b; return strncmp(a, b, len); } static unsigned get_bitwidth_by_arch_name(const char *arch_name) { char *m = bsearch( &arch_name, &isa64, lengthof(isa64), sizeof(isa64[0]), cmp_arch_name); if( m != NULL ) return 64; m = bsearch( &arch_name, &isa32, lengthof(isa32), sizeof(isa32[0]), cmp_arch_name); if( m != NULL ) return 32; return 0; } #endif static sg_error sg_get_host_info_int(sg_host_info *host_info_buf) { #ifdef WIN32 unsigned long nameln; char *name; long long result; OSVERSIONINFOEX osinfo; SYSTEM_INFO sysinfo; char *tmp_name; char tmp[10]; #else struct utsname os; # if defined(HPUX) struct pst_static pstat_static; struct pst_dynamic pstat_dynamic; time_t currtime; long boottime; # elif defined(SOLARIS) time_t boottime, curtime; kstat_ctl_t *kc; kstat_t *ksp; kstat_named_t *kn; char *isainfo = NULL; long isabufsz, rc; # elif defined(LINUX) || defined(CYGWIN) FILE *f; # elif defined(ALLBSD) int mib[2]; struct timeval boottime; time_t curtime; size_t size; int ncpus; # if defined(HW_MACHINE_ARCH) || defined(HW_MACHINE) char arch_name[16]; # endif # elif defined(AIX) static perfstat_cpu_total_t cpu_total; sg_error rc; # if defined(HAVE_GETUTXENT) struct utmpx *ut; # else struct utmp *ut; # endif # endif #endif host_info_buf->ncpus = 0; host_info_buf->maxcpus = 0; host_info_buf->bitwidth = 0; host_info_buf->host_state = sg_unknown_configuration; host_info_buf->uptime = 0; host_info_buf->systime = 0; #ifdef WIN32 /* these settings are static after boot, so why get them * constantly? * * Because we want to know some changes anyway - at least * when the hostname (DNS?) changes */ /* get system name */ nameln = MAX_COMPUTERNAME_LENGTH + 1; name = sg_malloc(nameln); if(name == NULL) { RETURN_FROM_PREVIOUS_ERROR( "os", sg_get_error() ); } /* * XXX probably GetComputerNameEx() is a better entry point ... */ if( GetComputerName(name, &nameln) == 0 ) { free(name); RETURN_WITH_SET_ERROR("os", SG_ERROR_HOST, "GetComputerName"); } if(SG_ERROR_NONE != sg_update_string(&host_info_buf->hostname, name)) { free(name); RETURN_FROM_PREVIOUS_ERROR( "os", sg_get_error() ); } free(name); /* get OS name, version and build */ ZeroMemory(&osinfo, sizeof(OSVERSIONINFOEX)); osinfo.dwOSVersionInfoSize = sizeof(osinfo); if(!GetVersionEx(&osinfo)) { RETURN_WITH_SET_ERROR("os", SG_ERROR_HOST, "GetVersionEx"); } /* Release - single number */ if(snprintf(tmp, sizeof(tmp), "%ld", osinfo.dwBuildNumber) == -1) { free(tmp); RETURN_WITH_SET_ERROR_WITH_ERRNO("os", SG_ERROR_SPRINTF, NULL); } if(SG_ERROR_NONE != sg_update_string(&host_info_buf->os_release, tmp)) { free(tmp); RETURN_FROM_PREVIOUS_ERROR( "os", sg_get_error() ); } /* Version */ /* usually a single digit . single digit, eg 5.0 */ if(snprintf(tmp, sizeof(tmp), "%ld.%ld", osinfo.dwMajorVersion, osinfo.dwMinorVersion) == -1) { free(tmp); RETURN_FROM_PREVIOUS_ERROR( "os", sg_get_error() ); } if(SG_ERROR_NONE != sg_update_string(&host_info_buf->os_version, tmp)) { free(tmp); RETURN_FROM_PREVIOUS_ERROR( "os", sg_get_error() ); } /* OS name */ tmp_name = get_os_name(osinfo); if(tmp_name == NULL) { RETURN_FROM_PREVIOUS_ERROR( "os", sg_get_error() ); } if(SG_ERROR_NONE != sg_update_string(&host_info_buf->os_name, tmp_name)) { free(tmp_name); RETURN_FROM_PREVIOUS_ERROR( "os", sg_get_error() ); } free(tmp_name); /* Platform */ GetSystemInfo(&sysinfo); switch(sysinfo.wProcessorArchitecture) { case PROCESSOR_ARCHITECTURE_INTEL: if(SG_ERROR_NONE != sg_update_string(&host_info_buf->platform, "Intel")) { RETURN_FROM_PREVIOUS_ERROR( "os", sg_get_error() ); } break; case PROCESSOR_ARCHITECTURE_IA64: if(SG_ERROR_NONE != sg_update_string(&host_info_buf->platform, "IA64")) { RETURN_FROM_PREVIOUS_ERROR( "os", sg_get_error() ); } break; case PROCESSOR_ARCHITECTURE_AMD64: if(SG_ERROR_NONE != sg_update_string(&host_info_buf->platform, "AMD64")) { RETURN_FROM_PREVIOUS_ERROR( "os", sg_get_error() ); } break; default: if(SG_ERROR_NONE != sg_update_string(&host_info_buf->platform, "Unknown")){ RETURN_FROM_PREVIOUS_ERROR( "os", sg_get_error() ); } break; } if(read_counter_large(SG_WIN32_UPTIME, &result)) { RETURN_WITH_SET_ERROR("os", SG_ERROR_PDHREAD, PDH_UPTIME); } host_info_buf->uptime = (time_t) result; #else if((uname(&os)) < 0) { RETURN_WITH_SET_ERROR_WITH_ERRNO("os", SG_ERROR_UNAME, NULL); } if(SG_ERROR_NONE != sg_update_string(&host_info_buf->os_name, os.sysname)) { RETURN_FROM_PREVIOUS_ERROR( "os", sg_get_error() ); } if(SG_ERROR_NONE != sg_update_string(&host_info_buf->os_release, os.release)) { RETURN_FROM_PREVIOUS_ERROR( "os", sg_get_error() ); } if(SG_ERROR_NONE != sg_update_string(&host_info_buf->os_version, os.version)) { RETURN_FROM_PREVIOUS_ERROR( "os", sg_get_error() ); } if(SG_ERROR_NONE != sg_update_string(&host_info_buf->platform, os.machine)) { RETURN_FROM_PREVIOUS_ERROR( "os", sg_get_error() ); } if(SG_ERROR_NONE != sg_update_string(&host_info_buf->hostname, os.nodename)) { RETURN_FROM_PREVIOUS_ERROR( "os", sg_get_error() ); } /* get uptime */ #ifdef HPUX if (pstat_getstatic(&pstat_static, sizeof(pstat_static), 1, 0) == -1) { RETURN_WITH_SET_ERROR_WITH_ERRNO("os", SG_ERROR_PSTAT, "pstat_static"); } if (pstat_getdynamic(&pstat_dynamic, sizeof(pstat_dynamic), 1, 0) == -1) { RETURN_WITH_SET_ERROR_WITH_ERRNO("os", SG_ERROR_PSTAT, "pstat_dynamic"); } currtime = time(NULL); boottime = pstat_static.boot_time; host_info_buf->uptime = currtime - boottime; host_info_buf->ncpus = pstat_dynamic.psd_proc_cnt; host_info_buf->maxcpus = pstat_dynamic.psd_max_proc_cnt; host_info_buf->bitwidth = sysconf(_SC_KERNEL_BITS); /* * TODO: getting virtualization state * 1) on boostrapping this component, try loading /opt/hpvm/lib/libhpvm.so (or so) * 2) get function addresses for * a) HPVM_boolean hpvm_api_server_check() * b) HPVM_boolean hpvm_api_virtmach_check() * * Seems to be hardware virtualization ... * See: http://docstore.mik.ua/manuals/hp-ux/en/T2767-90141/index.html (hpvmpubapi(3)) * http://jreypo.wordpress.com/tag/hpvm/ * http://jreypo.wordpress.com/category/hp-ux/page/3/ * http://h20338.www2.hp.com/enterprise/us/en/os/hpux11i-partitioning-integrity-vm.html */ #elif defined(SOLARIS) if ((kc = kstat_open()) == NULL) { RETURN_WITH_SET_ERROR("os", SG_ERROR_KSTAT_OPEN, NULL); } if((ksp=kstat_lookup(kc, "unix", -1, "system_misc"))==NULL){ kstat_close(kc); RETURN_WITH_SET_ERROR("os", SG_ERROR_KSTAT_LOOKUP, "unix,-1,system_misc"); } if (kstat_read(kc, ksp, 0) == -1) { kstat_close(kc); RETURN_WITH_SET_ERROR("os", SG_ERROR_KSTAT_READ, NULL); } if((kn=kstat_data_lookup(ksp, "boot_time")) == NULL){ kstat_close(kc); RETURN_WITH_SET_ERROR("os", SG_ERROR_KSTAT_DATA_LOOKUP, "boot_time"); } /* XXX verify on Solaris 10 if it's still ui32 */ boottime = (kn->value.ui32); kstat_close(kc); time(&curtime); host_info_buf->uptime = curtime - boottime; host_info_buf->ncpus = sysconf(_SC_NPROCESSORS_ONLN); host_info_buf->maxcpus = sysconf(_SC_NPROCESSORS_CONF); isainfo = sg_malloc( isabufsz = (32 * sizeof(*isainfo)) ); if( NULL == isainfo ) { RETURN_FROM_PREVIOUS_ERROR( "os", sg_get_error() ); } # define MKSTR(x) #x # if defined(SI_ARCHITECTURE_K) # define SYSINFO_CMD SI_ARCHITECTURE_K # elif defined(SI_ISALIST) # define SYSINFO_CMD SI_ISALIST # else # define SYSINFO_CMD SI_ARCHITECTURE # endif sysinfo_again: if( -1 == ( rc = sysinfo( SYSINFO_CMD, isainfo, isabufsz ) ) ) { free(isainfo); RETURN_WITH_SET_ERROR_WITH_ERRNO("os", SG_ERROR_SYSINFO, MKSTR(SYSINFO_CMD) ); } else if( rc > isabufsz ) { char *tmp = sg_realloc(isainfo, rc); if( NULL == tmp ) { free(isainfo); RETURN_FROM_PREVIOUS_ERROR( "os", sg_get_error() ); } isabufsz = rc; isainfo = tmp; goto sysinfo_again; } host_info_buf->bitwidth = get_bitwidth_by_arch_name(isainfo); free(isainfo); host_info_buf->host_state = sg_unknown_configuration; #elif defined(LINUX) || defined(CYGWIN) if ((f=fopen("/proc/uptime", "r")) == NULL) { RETURN_WITH_SET_ERROR_WITH_ERRNO("os", SG_ERROR_OPEN, "/proc/uptime"); } #define TIME_T_SCANF_FMT (sizeof(int[(((time_t)-1)/2)%4+1]) == sizeof(int[1]) ? "%ld %*d" : "%lu %*d" ) if((fscanf(f,TIME_T_SCANF_FMT,&host_info_buf->uptime)) != 1){ fclose(f); RETURN_WITH_SET_ERROR("os", SG_ERROR_PARSE, NULL); } fclose(f); # if defined(LINUX) host_info_buf->ncpus = sysconf(_SC_NPROCESSORS_ONLN); host_info_buf->maxcpus = sysconf(_SC_NPROCESSORS_CONF); if( access( "/proc/sys/kernel/vsyscall64", F_OK ) == 0 || access( "/proc/sys/abi/vsyscall32", F_OK ) == 0 ) { host_info_buf->bitwidth = 64; } else { host_info_buf->bitwidth = sysconf(_SC_LONG_BIT); // well, maybe 64-bit disabled 128-bit system o.O } host_info_buf->host_state = sg_unknown_configuration; # endif #elif defined(ALLBSD) mib[0] = CTL_KERN; mib[1] = KERN_BOOTTIME; size = sizeof(boottime); if (sysctl(mib, 2, &boottime, &size, NULL, 0) < 0) { RETURN_WITH_SET_ERROR_WITH_ERRNO("os", SG_ERROR_SYSCTL, "CTL_KERN.KERN_BOOTTIME"); } time(&curtime); host_info_buf->uptime= curtime - boottime.tv_sec; # if defined(HW_NCPU) mib[0] = CTL_HW; mib[1] = HW_NCPU; size = sizeof(int); if( sysctl( mib, 2, &ncpus, &size, NULL, 0 ) < 0 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("os", SG_ERROR_SYSCTL, "CTL_HW.HW_NCPU" ); } # endif # if defined(HW_MACHINE_ARCH) mib[0] = CTL_HW; mib[1] = HW_MACHINE_ARCH; size = sizeof(arch_name); if( sysctl( mib, 2, arch_name, &size, NULL, 0 ) == 0 ) { host_info_buf->bitwidth = get_bitwidth_by_arch_name(arch_name); } else { # endif # if defined(HW_MACHINE) mib[0] = CTL_HW; mib[1] = HW_MACHINE; size = sizeof(arch_name); if( sysctl( mib, 2, arch_name, &size, NULL, 0 ) == 0 ) { host_info_buf->bitwidth = get_bitwidth_by_arch_name(arch_name); } else { SET_ERROR_WITH_ERRNO("os", SG_ERROR_SYSCTL, "CTL_HW.HW_MACHINE" ); } # elif defined(HW_MACHINE_ARCH) SET_ERROR_WITH_ERRNO("os", SG_ERROR_SYSCTL, "CTL_HW.HW_MACHINE_ARCH" ); # endif # if defined(HW_MACHINE_ARCH) } # endif host_info_buf->host_state = sg_unknown_configuration; /* details must be analysed "manually", no syscall */ host_info_buf->maxcpus = (unsigned)ncpus; # if defined(HW_NCPUONLINE) /* use knowledge about number of cpu's online, when available instead of assuming all of them */ mib[0] = CTL_HW; mib[1] = HW_NCPUONLINE; size = sizeof(int); if( sysctl( mib, 2, &ncpus, &size, NULL, 0 ) < 0 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("os", SG_ERROR_SYSCTL, "CTL_HW.HW_NCPUONLINE" ); } # endif host_info_buf->ncpus = (unsigned)ncpus; #elif defined(AIX) if(perfstat_cpu_total(NULL, &cpu_total, sizeof(cpu_total), 1) != 1) { RETURN_WITH_SET_ERROR_WITH_ERRNO("os", SG_ERROR_SYSCTL, "perfstat_cpu_total"); } if(SG_ERROR_NONE != sg_update_string(&host_info_buf->platform, cpu_total.description)) { RETURN_FROM_PREVIOUS_ERROR( "os", sg_get_error() ); } host_info_buf->ncpus = cpu_total.ncpus; host_info_buf->maxcpus = cpu_total.ncpus_cfg; host_info_buf->bitwidth = sysconf(_SC_AIX_KERNEL_BITMODE); if( sysconf(_SC_LPAR_ENABLED) > 0 ) { host_info_buf->host_state = sg_hardware_virtualized; } else { host_info_buf->host_state = sg_physical_host; } #ifdef ENABLE_THREADS if( SG_ERROR_NONE != ( rc = sg_lock_mutex("utmp") ) ) { RETURN_FROM_PREVIOUS_ERROR( "os", rc ); } #endif # if defined(HAVE_GETUTXENT) # define UTENTFN getutxent # define UTENTTM ut->ut_tv.tv_sec setutxent(); # else # define UTENTFN getutent # define UTENTTM ut->ut_time setutent(); # endif while( NULL != ( ut = UTENTFN() ) ) { if( ut->ut_type == BOOT_TIME ) { host_info_buf->uptime = time(NULL) - UTENTTM; break; } } # if defined(HAVE_GETUTXENT) endutxent(); # else endutent(); # endif #ifdef ENABLE_THREADS if( SG_ERROR_NONE != ( rc = sg_unlock_mutex("utmp") ) ) { RETURN_FROM_PREVIOUS_ERROR( "os", rc ); } #endif #else RETURN_WITH_SET_ERROR("os", SG_ERROR_UNSUPPORTED, OS_TYPE); #endif #endif /* WIN32 */ host_info_buf->systime = time(NULL); return SG_ERROR_NONE; } #ifdef AIX EASY_COMP_SETUP(os,1,"utmp",NULL); #else EASY_COMP_SETUP(os,1,NULL); #endif typedef sg_host_info sg_os_stats; static void sg_os_stats_item_init(sg_os_stats *d) { memset( d, 0, sizeof(*d) ); } #if 0 #else #define sg_os_stats_item_copy NULL #define sg_os_stats_item_compute_diff NULL #define sg_os_stats_item_compare NULL #endif static void sg_os_stats_item_destroy(sg_os_stats *d) { free(d->os_name); free(d->os_release); free(d->os_version); free(d->platform); free(d->hostname); memset( d, 0, sizeof(*d) ); } VECTOR_INIT_INFO_FULL_INIT(sg_os_stats); #define SG_OS_CUR_IDX 0 EASY_COMP_ACCESS(sg_get_host_info,os,os,SG_OS_CUR_IDX) libstatgrab-0.90/src/libstatgrab/user_stats.c000644 001750 001750 00000024674 12200025312 021341 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #include "tools.h" static void sg_user_stats_item_init(sg_user_stats *d) { d->login_name = NULL; d->record_id = NULL; d->record_id_size = 0; d->device = NULL; d->hostname = NULL; d->login_time = 0; d->systime = 0; } #if 0 static sg_error sg_user_stats_item_copy(sg_user_stats *d, const sg_user_stats *s) { if( SG_ERROR_NONE != sg_update_string(&d->login_name, s->login_name) || SG_ERROR_NONE != sg_update_mem(&d->record_id, s->record_id, s->record_id_size) || SG_ERROR_NONE != sg_update_string(&d->device, s->device) || SG_ERROR_NONE != sg_update_string(&d->hostname, s->hostname) ) { RETURN_FROM_PREVIOUS_ERROR( "user", sg_get_error() ); } d->record_id_size = s->record_id_size; d->pid = s->pid; d->tv = s->tv; return SG_ERROR_NONE; } #else #define sg_user_stats_item_copy NULL #endif #define sg_user_stats_item_compute_diff NULL #define sg_user_stats_item_compare NULL static void sg_user_stats_item_destroy(sg_user_stats *d) { free(d->login_name); free(d->record_id); free(d->device); free(d->hostname); } VECTOR_INIT_INFO_FULL_INIT(sg_user_stats); #if defined(HAVE_GETUTXENT) && defined(HAVE_SETUTXENT) && defined(HAVE_ENDUTXENT) && defined(HAVE_STRUCT_UTMPX) # define CAN_USE_UTMPX # if defined(HAVE_DECL_GETUTXENT) && !HAVE_DECL_GETUTXENT extern struct utmpx * getutxent(void); # endif # if defined(HAVE_DECL_SETUTXENT) && !HAVE_DECL_SETUTXENT extern void setutxent(void); # endif # if defined(HAVE_DECL_ENDUTXENT) && !HAVE_DECL_ENDUTXENT extern void endutxent(void); # endif #endif #if defined(HAVE_GETUTENT) && defined(HAVE_SETUTENT) && defined(HAVE_ENDUTENT) && defined(HAVE_STRUCT_UTMP) # define CAN_USE_UTMP # if defined(HAVE_DECL_GETUTENT) && !HAVE_DECL_GETUTENT extern struct utmp * getutent(void); # endif # if defined(HAVE_DECL_SETUTENT) && !HAVE_DECL_SETUTENT extern void setutent(void); # endif # if defined(HAVE_DECL_ENDUTENT) && !HAVE_DECL_ENDUTENT extern void endutent(void); # endif #endif static sg_error sg_get_user_stats_int(sg_vector **user_stats_vector_ptr) { size_t num_users = 0; sg_user_stats *user_ptr; time_t now = time(NULL); #if defined (WIN32) LPWKSTA_USER_INFO_0 buf = NULL; LPWKSTA_USER_INFO_0 tmp_buf; unsigned long entries_read = 0; unsigned long entries_tot = 0; unsigned long resumehandle = 0; NET_API_STATUS nStatus; int i; char name[256]; #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP if (buf != NULL) NetApiBufferFree(buf); do { nStatus = NetWkstaUserEnum(NULL, 0, (LPBYTE*)&buf, MAX_PREFERRED_LENGTH, &entries_read, &entries_tot, &resumehandle); if((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA)) { if((tmp_buf = buf) == NULL) continue; for( i = 0; i < entries_read; ++i ) { /* assert(tmp_buf != NULL); */ if( tmp_buf == NULL ) { sg_set_error(SG_ERROR_PERMISSION, "User list"); ERROR_LOG("user", "Permission denied fetching user details"); break; /* XXX break and not return? */ } /* It's in unicode. We are not. Convert */ WideCharToMultiByte(CP_ACP, 0, tmp_buf->wkui0_username, -1, name, sizeof(name), NULL, NULL); VECTOR_UPDATE(user_stats_vector_ptr, num_users + 1, user_ptr, sg_user_stats); if( SG_ERROR_NONE != sg_update_string( &user_ptr[num_users].login_name, name ) ) { VECTOR_UPDATE_ERROR_CLEANUP RETURN_FROM_PREVIOUS_ERROR( "user", sg_get_error() ); } user_ptr[num_users].systime = now; ++tmp_buf; ++num_users; } } else { RETURN_WITH_SET_ERROR("user", SG_ERROR_PERMISSION, "User enum"); } if (buf != NULL) { NetApiBufferFree(buf); buf=NULL; } } while (nStatus == ERROR_MORE_DATA); if (buf != NULL) NetApiBufferFree(buf); #elif defined(CAN_USE_UTMPX) || defined(CAN_USE_UTMP) #define SG_LUPDATE_IF(tgt,obj,memb) \ (((void *)(&(obj->memb))) == ((void *)(&(obj->memb[0])))) \ ? sg_lupdate_string(tgt, obj->memb, sizeof(obj->memb))\ : sg_update_string(tgt, obj->memb) #define UTMP_MUTEX_NAME "utmp" #undef VECTOR_UPDATE_ERROR_CLEANUP # if defined(CAN_USE_UTMPX) struct utmpx *utx; # endif # if defined(CAN_USE_UTMP) struct utmp *ut; # endif /* following block contains code for utmpx */ # if defined(CAN_USE_UTMPX) # ifdef ENABLE_THREADS # define VECTOR_UPDATE_ERROR_CLEANUP endutxent(); sg_unlock_mutex(UTMP_MUTEX_NAME); sg_lock_mutex(UTMP_MUTEX_NAME); # else # define VECTOR_UPDATE_ERROR_CLEANUP endutxent(); # endif setutxent(); while( NULL != (utx = getutxent()) ) { if( USER_PROCESS != utx->ut_type ) continue; VECTOR_UPDATE(user_stats_vector_ptr, num_users + 1, user_ptr, sg_user_stats); if( ( SG_ERROR_NONE != SG_LUPDATE_IF( &user_ptr[num_users].login_name, utx, ut_user ) ) || # if defined(HAVE_UTMPX_HOST) # if defined(HAVE_UTMPX_SYSLEN) ( SG_ERROR_NONE != sg_lupdate_string( &user_ptr[num_users].hostname, utx->ut_host, utx->ut_syslen + 1 ) ) || # else ( SG_ERROR_NONE != SG_LUPDATE_IF( &user_ptr[num_users].hostname, utx, ut_host ) ) || # endif # endif ( SG_ERROR_NONE != SG_LUPDATE_IF( &user_ptr[num_users].device, utx, ut_line ) ) || ( SG_ERROR_NONE != sg_update_mem( (void *)(&user_ptr[num_users].record_id), utx->ut_id, sizeof(utx->ut_id) ) ) ) { VECTOR_UPDATE_ERROR_CLEANUP RETURN_FROM_PREVIOUS_ERROR( "user", sg_get_error() ); } user_ptr[num_users].record_id_size = sizeof(utx->ut_id); user_ptr[num_users].pid = utx->ut_pid; user_ptr[num_users].login_time = utx->ut_tv.tv_sec; user_ptr[num_users].systime = now; ++num_users; } endutxent(); if(!num_users) { # endif /* following block contains code for utmp */ # if defined(CAN_USE_UTMP) # undef VECTOR_UPDATE_ERROR_CLEANUP # ifdef ENABLE_THREADS # define VECTOR_UPDATE_ERROR_CLEANUP endutent(); sg_unlock_mutex(UTMP_MUTEX_NAME); # else # define VECTOR_UPDATE_ERROR_CLEANUP endutent(); # endif setutent(); while( NULL != (ut = getutent()) ) { # ifdef HAVE_UTMP_TYPE if( USER_PROCESS != ut->ut_type ) continue; # elif defined(HAVE_UTMP_NAME) if (ut->ut_name[0] == '\0') continue; # elif defined(HAVE_UTMP_USER) if (ut->ut_user[0] == '\0') continue; # endif VECTOR_UPDATE(user_stats_vector_ptr, num_users + 1, user_ptr, sg_user_stats); if( ( SG_ERROR_NONE != SG_LUPDATE_IF( &user_ptr[num_users].device, ut, ut_line ) ) # if defined(HAVE_UTMP_USER) || ( SG_ERROR_NONE != SG_LUPDATE_IF( &user_ptr[num_users].login_name, ut, ut_user ) ) # elif defined(HAVE_UTMP_NAME) || ( SG_ERROR_NONE != SG_LUPDATE_IF( &user_ptr[num_users].login_name, ut, ut_name ) ) # endif # if defined(HAVE_UTMP_HOST) || ( SG_ERROR_NONE != SG_LUPDATE_IF( &user_ptr[num_users].hostname, ut, ut_host ) ) # endif # if defined(HAVE_UTMP_ID) || ( SG_ERROR_NONE != sg_update_mem( (void **)(&user_ptr[num_users].record_id), ut->ut_id, sizeof(ut->ut_id) ) ) # endif ) { VECTOR_UPDATE_ERROR_CLEANUP RETURN_FROM_PREVIOUS_ERROR( "user", sg_get_error() ); } # if defined(HAVE_UTMP_ID) user_ptr[num_users].record_id_size = sizeof(ut->ut_id); # endif # if defined(HAVE_UTMP_PID) user_ptr[num_users].pid = ut->ut_pid; # endif #if defined(HAVE_UTMP_TIME) user_ptr[num_users].login_time = ut->ut_time; #endif user_ptr[num_users].systime = now; ++num_users; } endutent(); # endif # if defined(CAN_USE_UTMPX) } #endif # ifdef ENABLE_THREADS sg_unlock_mutex(UTMP_MUTEX_NAME); # endif #elif defined(HAVE_STRUCT_UTMP) && defined(_PATH_UTMP) struct utmp entry; FILE *f; if ((f=fopen(_PATH_UTMP, "r")) == NULL) { RETURN_WITH_SET_ERROR_WITH_ERRNO("user", SG_ERROR_OPEN, _PATH_UTMP); } #ifdef SG_LUPDATE_IF #undef SG_LUPDATE_IF #endif #define SG_LUPDATE_IF(tgt,obj,memb) \ (((void *)(&(obj.memb))) == ((void *)(&(obj.memb[0])))) \ ? sg_lupdate_string(tgt, obj.memb, sizeof(obj.memb))\ : sg_update_string(tgt, obj.memb) #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP fclose(f); while((fread(&entry, sizeof(entry),1,f)) != 0){ #ifdef HAVE_UTMP_TYPE if( USER_PROCESS != ut->ut_type ) continue; #elif defined(HAVE_UTMP_NAME) if (entry.ut_name[0] == '\0') continue; #elif defined(HAVE_UTMP_USER) if (entry.ut_user[0] == '\0') continue; #endif VECTOR_UPDATE(user_stats_vector_ptr, num_users + 1, user_ptr, sg_user_stats); if( ( SG_ERROR_NONE != SG_LUPDATE_IF( &user_ptr[num_users].device, entry, ut_line ) ) #if defined(HAVE_UTMP_USER) || ( SG_ERROR_NONE != SG_LUPDATE_IF( &user_ptr[num_users].login_name, entry, ut_user ) ) #elif defined(HAVE_UTMP_NAME) || ( SG_ERROR_NONE != SG_LUPDATE_IF( &user_ptr[num_users].login_name, entry, ut_name ) ) #endif #if defined(HAVE_UTMP_HOST) || ( SG_ERROR_NONE != SG_LUPDATE_IF( &user_ptr[num_users].hostname, entry, ut_host ) ) #endif #if defined(HAVE_UTMP_ID) || ( SG_ERROR_NONE != sg_update_mem( &user_ptr[num_users].record_id, entry.ut_id, sizeof(entry.ut_id) ) ) #endif ) { VECTOR_UPDATE_ERROR_CLEANUP RETURN_FROM_PREVIOUS_ERROR( "user", sg_get_error() ); } #if defined(HAVE_UTMP_ID) user_ptr[num_users].record_id_size = sizeof(entry.ut_id); #endif #if defined(HAVE_UTMP_PID) user_ptr[num_users].pid = entry.ut_pid; #endif #if defined(HAVE_UTMP_TIME) user_ptr[num_users].login_time = entry.ut_time; #endif user_ptr[num_users].systime = now; ++num_users; } fclose(f); #else RETURN_WITH_SET_ERROR("user", SG_ERROR_UNSUPPORTED, OS_TYPE); #endif return SG_ERROR_NONE; } /* * setup code */ #define SG_USER_STATS_NOW_IDX 0 #define SG_USER_MAX_IDX 1 #if defined(UTMP_MUTEX_NAME) EASY_COMP_SETUP(user,SG_USER_MAX_IDX,UTMP_MUTEX_NAME,NULL); #else EASY_COMP_SETUP(user,SG_USER_MAX_IDX,NULL); #endif MULTI_COMP_ACCESS(sg_get_user_stats,user,user,SG_USER_STATS_NOW_IDX) libstatgrab-0.90/src/libstatgrab/Makefile.in000644 001750 001750 00000053763 12200045540 021054 0ustar00tdbusers000000 000000 # Makefile.in generated by automake 1.12.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile for libstatgrab/src/libstatgrab # http://www.i-scream.org/libstatgrab/ # $Id$ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/libstatgrab DIST_COMMON = $(include_HEADERS) $(noinst_HEADERS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/statgrab.h.in $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_lib.m4 \ $(top_srcdir)/m4/ax_ncurses.m4 $(top_srcdir)/m4/ax_perl5.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_shellvars.m4 $(top_srcdir)/m4/ax_types.m4 \ $(top_srcdir)/m4/ax_visibility.m4 $(top_srcdir)/m4/ax_win32.m4 \ $(top_srcdir)/m4/ax_xopen.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = statgrab.h CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" LTLIBRARIES = $(lib_LTLIBRARIES) libstatgrab_la_LIBADD = am__libstatgrab_la_SOURCES_DIST = cpu_stats.c disk_stats.c \ load_stats.c memory_stats.c network_stats.c os_info.c \ page_stats.c process_stats.c swap_stats.c user_stats.c tools.c \ vector.c error.c globals.c win32.c @MINGW_TRUE@am__objects_1 = win32.lo am_libstatgrab_la_OBJECTS = cpu_stats.lo disk_stats.lo load_stats.lo \ memory_stats.lo network_stats.lo os_info.lo page_stats.lo \ process_stats.lo swap_stats.lo user_stats.lo tools.lo \ vector.lo error.lo globals.lo $(am__objects_1) libstatgrab_la_OBJECTS = $(am_libstatgrab_la_OBJECTS) libstatgrab_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libstatgrab_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libstatgrab_la_SOURCES) DIST_SOURCES = $(am__libstatgrab_la_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(include_HEADERS) $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIN_GROUP = @BIN_GROUP@ BIN_OWNER = @BIN_OWNER@ BIN_PERM = @BIN_PERM@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CLIBFLAGS = @CLIBFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOCBOOK2MAN = @DOCBOOK2MAN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ HAVE_LIBLOG4CPLUS = @HAVE_LIBLOG4CPLUS@ INC_LOG4CPLUS = @INC_LOG4CPLUS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBS_LOG4CPLUS = @LIBS_LOG4CPLUS@ LIBTOOL = @LIBTOOL@ LINKFLAGS = @LINKFLAGS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL5 = @PERL5@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SAIDARCPPFLAGS = @SAIDARCPPFLAGS@ SAIDARLIBS = @SAIDARLIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SG_EXPORT = @SG_EXPORT@ SG_IMPORT = @SG_IMPORT@ SG_PRIVATE = @SG_PRIVATE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_LIBLOG4CPLUS = @WITH_LIBLOG4CPLUS@ WITH_THREADS_CONFIGURED = @WITH_THREADS_CONFIGURED@ WITH_VISIBILITY_SUPPORT = @WITH_VISIBILITY_SUPPORT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log4cplus_CFLAGS = @log4cplus_CFLAGS@ log4cplus_LIBS = @log4cplus_LIBS@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = $(PTHREAD_CFLAGS) -DBUILD_LIBSTATGRAB @CLIBFLAGS@ include_HEADERS = statgrab.h lib_LTLIBRARIES = libstatgrab.la libstatgrab_la_LDFLAGS = -version-info 9:0:0 @LINKFLAGS@ @MINGW_TRUE@libstatgrab_la_MINGWSOURCES = win32.c libstatgrab_la_SOURCES = cpu_stats.c disk_stats.c load_stats.c memory_stats.c network_stats.c os_info.c page_stats.c process_stats.c swap_stats.c user_stats.c \ tools.c vector.c error.c globals.c $(libstatgrab_la_MINGWSOURCES) noinst_HEADERS = error.h globals.h trace.h tools.h vector.h win32.h EXTRA_DIST = statgrab.h.in all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/libstatgrab/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/libstatgrab/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): statgrab.h: $(top_builddir)/config.status $(srcdir)/statgrab.h.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libstatgrab.la: $(libstatgrab_la_OBJECTS) $(libstatgrab_la_DEPENDENCIES) $(EXTRA_libstatgrab_la_DEPENDENCIES) $(libstatgrab_la_LINK) -rpath $(libdir) $(libstatgrab_la_OBJECTS) $(libstatgrab_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu_stats.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disk_stats.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/globals.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/load_stats.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memory_stats.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/network_stats.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/os_info.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/page_stats.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/process_stats.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/swap_stats.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tools.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/user_stats.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/win32.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ done uninstall-includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-includeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool cscopelist ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-includeHEADERS install-info \ install-info-am install-libLTLIBRARIES install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-includeHEADERS \ uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libstatgrab-0.90/src/libstatgrab/network_stats.c000644 001750 001750 00000120723 12200025312 022044 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #ifdef _AIX #define __NEED_SG_GET_SYS_PAGE_SIZE #endif #include "tools.h" static void sg_network_io_stats_item_init(sg_network_io_stats *d) { memset( d, 0, sizeof(*d) ); } static sg_error sg_network_io_stats_item_copy(const sg_network_io_stats *s, sg_network_io_stats *d) { if( SG_ERROR_NONE != sg_update_string(&d->interface_name, s->interface_name) ) { RETURN_FROM_PREVIOUS_ERROR( "network", sg_get_error() ); } d->tx = s->tx; d->rx = s->rx; d->ipackets = s->ipackets; d->opackets = s->opackets; d->ierrors = s->ierrors; d->oerrors = s->oerrors; d->collisions = s->collisions; d->systime = s->systime; return SG_ERROR_NONE; } static unsigned long long transfer_diff(unsigned long long new, unsigned long long old){ #if defined(SOL7) || defined(LINUX) || defined(FREEBSD) || defined(DFBSD) || defined(OPENBSD) || defined(WIN32) /* 32-bit quantities, so we must explicitly deal with wraparound. */ #define MAXVAL 0x100000000LL long long cmp_new = (long long)new, cmp_old = (long long)old; if (cmp_new >= cmp_old) { return new - old; } else { return (unsigned long long)(MAXVAL + cmp_new - cmp_old); } #else /* 64-bit quantities, so plain subtraction works. */ return new - old; #endif } static sg_error sg_network_io_stats_item_compute_diff(const sg_network_io_stats *s, sg_network_io_stats *d) { d->tx = transfer_diff( d->tx, s->tx ); d->rx = transfer_diff( d->rx, s->rx ); d->ipackets = transfer_diff( d->ipackets, s->ipackets ); d->opackets = transfer_diff( d->opackets, s->opackets ); d->ierrors = transfer_diff( d->ierrors, s->ierrors ); d->oerrors = transfer_diff( d->oerrors, s->oerrors ); d->collisions = transfer_diff( d->collisions, s->collisions ); d->systime -= s->systime; return SG_ERROR_NONE; } static int sg_network_io_stats_item_compare(const sg_network_io_stats *a, const sg_network_io_stats *b) { return strcmp( a->interface_name, b->interface_name ); } static void sg_network_io_stats_item_destroy(sg_network_io_stats *d) { free(d->interface_name); d->interface_name = NULL; } static void sg_network_iface_stats_item_init(sg_network_iface_stats *d) { d->interface_name = NULL; d->speed = 0; d->factor = 0; d->duplex = SG_IFACE_DUPLEX_UNKNOWN; d->up = SG_IFACE_DOWN; d->systime = 0; } static sg_error sg_network_iface_stats_item_copy(sg_network_iface_stats *d, const sg_network_iface_stats *s) { if( SG_ERROR_NONE != sg_update_string(&d->interface_name, s->interface_name) ) { RETURN_FROM_PREVIOUS_ERROR( "network", sg_get_error() ); } d->speed = s->speed; d->factor = s->factor; d->duplex = s->duplex; d->up = s->up; d->systime = s->systime; return SG_ERROR_NONE; } #define sg_network_iface_stats_item_compute_diff NULL #define sg_network_iface_stats_item_compare NULL static void sg_network_iface_stats_item_destroy(sg_network_iface_stats *d) { free(d->interface_name); } VECTOR_INIT_INFO_FULL_INIT(sg_network_io_stats); VECTOR_INIT_INFO_FULL_INIT(sg_network_iface_stats); /* * setup code */ #define SG_NETWORK_IO_NOW_IDX 0 #define SG_NETWORK_IO_DIFF_IDX 1 #define SG_NETWORK_IFACE_IDX 2 #define SG_NETWORK_MAX_IDX 3 EXTENDED_COMP_SETUP(network,SG_NETWORK_MAX_IDX,NULL); #ifdef LINUX static regex_t network_io_rx; #define RX_MATCH_COUNT (8+1) #endif static sg_error sg_network_init_comp(unsigned id) { #ifdef __NEED_SG_GET_SYS_PAGE_SIZE ssize_t pagesize; #endif GLOBAL_SET_ID(network,id); #ifdef LINUX if (regcomp(&network_io_rx, "^[[:space:]]*([^:]+):[[:space:]]*" \ "([0-9]+)[[:space:]]+" \ "([0-9]+)[[:space:]]+" \ "([0-9]+)[[:space:]]+" \ "[0-9]+[[:space:]]+" \ "[0-9]+[[:space:]]+" \ "[0-9]+[[:space:]]+" \ "[0-9]+[[:space:]]+" \ "[0-9]+[[:space:]]+" \ "([0-9]+)[[:space:]]+" \ "([0-9]+)[[:space:]]+" \ "([0-9]+)[[:space:]]+" \ "[0-9]+[[:space:]]+" \ "[0-9]+[[:space:]]+" \ "([0-9]+)", REG_EXTENDED)!=0) { RETURN_WITH_SET_ERROR("network", SG_ERROR_PARSE, "regcomp"); } #endif #ifdef __NEED_SG_GET_SYS_PAGE_SIZE if((pagesize = sg_get_sys_page_size()) == -1) { RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_SYSCONF, "_SC_PAGESIZE"); } #endif return SG_ERROR_NONE; } static void sg_network_destroy_comp(void) { #ifdef LINUX regfree(&network_io_rx); #endif } EASY_COMP_CLEANUP_FN(network,SG_NETWORK_MAX_IDX) /* real stuff */ #ifdef WIN32 static PMIB_IFTABLE win32_get_devices(void) { PMIB_IFTABLE if_table; PMIB_IFTABLE tmp; unsigned long dwSize = 0; // Allocate memory for pointers if_table = sg_malloc(sizeof(MIB_IFTABLE)); if( if_table == NULL ) { return NULL; } // Get necessary size for the buffer if(GetIfTable(if_table, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) { tmp = sg_realloc(if_table, dwSize); if(tmp == NULL) { free(if_table); return NULL; } if_table = tmp; } // Get the data if(GetIfTable(if_table, &dwSize, 0) != NO_ERROR) { free(if_table); return NULL; } return if_table; } #endif /* WIN32 */ static sg_error sg_get_network_io_stats_int(sg_vector **network_io_stats_vector_ptr){ ssize_t interfaces = 0; sg_network_io_stats *network_io_ptr; #ifdef HPUX /* * talk to Data Link Provider Interface aka /dev/dlpi * see: http://docs.hp.com/hpux/onlinedocs/B2355-90139/B2355-90139.html */ #define BUF_SIZE 40960 u_long *ctrl_area = malloc(BUF_SIZE); u_long *data_area = malloc(BUF_SIZE); u_long *ppa_area = malloc(BUF_SIZE); struct strbuf ctrl_buf = {BUF_SIZE, 0, (char*) ctrl_area}; struct strbuf data_buf = {BUF_SIZE, 0, (char*) data_area}; dl_hp_ppa_info_t *ppa_info; dl_hp_ppa_req_t *ppa_req; dl_hp_ppa_ack_t *ppa_ack; char name_buf[24]; int fd = -1, ppa_count, count, flags; #elif defined(SOLARIS) kstat_ctl_t *kc; kstat_t *ksp; kstat_named_t *knp; #elif defined(LINUX) FILE *f; char line[1024]; regmatch_t line_match[RX_MATCH_COUNT]; #elif defined(ALLBSD) struct ifaddrs *net, *net_ptr; struct if_data *net_data; #elif defined(WIN32) PMIB_IFTABLE if_table; MIB_IFROW if_row; int i; /* used for duplicate interface names. 5 for space, hash, up to two * numbers and terminating slash */ char buf[5]; #elif defined(AIX) ssize_t i; perfstat_netinterface_t *statp; perfstat_id_t first; #endif #ifdef HPUX if ((NULL == ctrl_area) || (NULL == data_area) || (NULL == ppa_area)) { free(ctrl_area); free(data_area); free(ppa_area); RETURN_WITH_SET_ERROR("network", SG_ERROR_MALLOC, "sg_get_network_io_stats"); } if ((fd = open("/dev/dlpi", O_RDWR)) < 0) { free(ctrl_area); free(data_area); free(ppa_area); RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_OPEN, "/dev/dlpi"); } #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP close(fd); free(ctrl_area); free(data_area); free(ppa_area); ppa_req = (dl_hp_ppa_req_t *) ctrl_area; ppa_ack = (dl_hp_ppa_ack_t *) ctrl_area; ppa_req->dl_primitive = DL_HP_PPA_REQ; ctrl_buf.len = sizeof(dl_hp_ppa_req_t); if(putmsg(fd, &ctrl_buf, 0, 0) < 0) { VECTOR_UPDATE_ERROR_CLEANUP RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_PUTMSG, "DL_HP_PPA_REQ"); } flags = 0; ctrl_area[0] = 0; if (getmsg(fd, &ctrl_buf, &data_buf, &flags) < 0) { VECTOR_UPDATE_ERROR_CLEANUP RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_GETMSG, "DL_HP_PPA_REQ"); } if (ppa_ack->dl_length == 0) { VECTOR_UPDATE_ERROR_CLEANUP RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_PARSE, "DL_HP_PPA_REQ"); } // save all the PPA information memcpy ((u_char*) ppa_area, &(((u_char*) ctrl_area)[ppa_ack->dl_offset]), ppa_ack->dl_length); ppa_count = ppa_ack->dl_count; for (count = 0, ppa_info = (dl_hp_ppa_info_t*) ppa_area; count < ppa_count; ++count) { dl_get_statistics_req_t *get_statistics_req = (dl_get_statistics_req_t*) ctrl_area; dl_get_statistics_ack_t *get_statistics_ack = (dl_get_statistics_ack_t*) ctrl_area; dl_attach_req_t *attach_req; dl_detach_req_t *detach_req; mib_ifEntry *mib_ptr; #ifdef HPUX11 mib_Dot3StatsEntry *mib_Dot3_ptr; #endif attach_req = (dl_attach_req_t*) ctrl_area; attach_req->dl_primitive = DL_ATTACH_REQ; attach_req->dl_ppa = ppa_info[count].dl_ppa; ctrl_buf.len = sizeof(dl_attach_req_t); if (putmsg(fd, &ctrl_buf, 0, 0) < 0) { unsigned ppa_lan_number = ppa_info[count].dl_ppa; VECTOR_UPDATE_ERROR_CLEANUP RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_PUTMSG, "DL_ATTACH_REQ ppa %u", ppa_lan_number); } ctrl_area[0] = 0; if (getmsg(fd, &ctrl_buf, &data_buf, &flags) < 0) { unsigned ppa_lan_number = ppa_info[count].dl_ppa; VECTOR_UPDATE_ERROR_CLEANUP RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_GETMSG, "DL_ATTACH_REQ ppa %u", ppa_lan_number); } get_statistics_req->dl_primitive = DL_GET_STATISTICS_REQ; ctrl_buf.len = sizeof(dl_get_statistics_req_t); if (putmsg(fd, &ctrl_buf, NULL, 0) < 0) { unsigned ppa_lan_number = ppa_info[count].dl_ppa; VECTOR_UPDATE_ERROR_CLEANUP RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_PUTMSG, "DL_GET_STATISTICS_REQ ppa %u", ppa_lan_number); } flags = 0; ctrl_area[0] = 0; if (getmsg(fd, &ctrl_buf, NULL, &flags) < 0) { unsigned ppa_lan_number = ppa_info[count].dl_ppa; VECTOR_UPDATE_ERROR_CLEANUP RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_GETMSG, "DL_GET_STATISTICS_REQ ppa %u", ppa_lan_number); } if (get_statistics_ack->dl_primitive != DL_GET_STATISTICS_ACK) { unsigned ppa_lan_number = ppa_info[count].dl_ppa; VECTOR_UPDATE_ERROR_CLEANUP RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_PARSE, "DL_GET_STATISTICS_ACK ppa %u", ppa_lan_number); } mib_ptr = (mib_ifEntry *) (void *)(((u_char*) ctrl_area) + (size_t)(get_statistics_ack->dl_stat_offset)); if (0 == (mib_ptr->ifOper & 1)) continue; VECTOR_UPDATE(network_io_stats_vector_ptr, interfaces + 1, network_io_ptr, sg_network_io_stats); snprintf( name_buf, sizeof(name_buf), "lan%d", ppa_info[count].dl_ppa ); if ( SG_ERROR_NONE != sg_update_string(&network_io_ptr[interfaces].interface_name, name_buf ) ) { VECTOR_UPDATE_ERROR_CLEANUP RETURN_FROM_PREVIOUS_ERROR( "network", sg_get_error() ); } network_io_ptr[interfaces].rx = mib_ptr->ifInOctets; network_io_ptr[interfaces].tx = mib_ptr->ifOutOctets; network_io_ptr[interfaces].ipackets = mib_ptr->ifInUcastPkts + mib_ptr->ifInNUcastPkts; network_io_ptr[interfaces].opackets = mib_ptr->ifOutUcastPkts + mib_ptr->ifOutNUcastPkts; network_io_ptr[interfaces].ierrors = mib_ptr->ifInErrors; network_io_ptr[interfaces].oerrors = mib_ptr->ifOutErrors; #ifdef HPUX11 mib_Dot3_ptr = (mib_Dot3StatsEntry *) (((char *) mib_ptr) + sizeof (mib_ifEntry)); network_io_ptr[interfaces].collisions = mib_Dot3_ptr->dot3StatsSingleCollisionFrames + mib_Dot3_ptr->dot3StatsMultipleCollisionFrames; #else network_io_ptr[interfaces].collisions = 0; /* currently unknown */ #endif network_io_ptr[interfaces].systime = time(NULL); ++interfaces; detach_req = (dl_detach_req_t*) ctrl_area; detach_req->dl_primitive = DL_DETACH_REQ; ctrl_buf.len = sizeof(dl_detach_req_t); if (putmsg(fd, &ctrl_buf, 0, 0) < 0) { unsigned ppa_lan_number = ppa_info[count].dl_ppa; VECTOR_UPDATE_ERROR_CLEANUP RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_PUTMSG, "DL_DETACH_REQ ppa %u", ppa_lan_number); } ctrl_area[0] = 0; flags = 0; if (getmsg(fd, &ctrl_buf, &data_buf, &flags) < 0) { unsigned ppa_lan_number = ppa_info[count].dl_ppa; VECTOR_UPDATE_ERROR_CLEANUP RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_GETMSG, "DL_DETACH_REQ ppa %u", ppa_lan_number); } } close(fd); free(ctrl_area); free(data_area); free(ppa_area); #elif defined(ALLBSD) if (getifaddrs(&net) != 0) { RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_GETIFADDRS, NULL); } for( net_ptr=net; net_ptr != NULL; net_ptr = net_ptr->ifa_next ) { if( net_ptr->ifa_addr->sa_family != AF_LINK ) continue; ++interfaces; } #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP freeifaddrs(net); VECTOR_UPDATE(network_io_stats_vector_ptr, interfaces, network_io_ptr, sg_network_io_stats); for( interfaces = 0, net_ptr = net; net_ptr != NULL; net_ptr = net_ptr->ifa_next ) { if( net_ptr->ifa_addr->sa_family != AF_LINK ) continue; if( sg_update_string(&network_io_ptr[interfaces].interface_name, net_ptr->ifa_name) != SG_ERROR_NONE ) { RETURN_FROM_PREVIOUS_ERROR( "network", sg_get_error() ); } net_data = (struct if_data *)net_ptr->ifa_data; network_io_ptr[interfaces].rx = net_data->ifi_ibytes; network_io_ptr[interfaces].tx = net_data->ifi_obytes; network_io_ptr[interfaces].ipackets = net_data->ifi_ipackets; network_io_ptr[interfaces].opackets = net_data->ifi_opackets; network_io_ptr[interfaces].ierrors = net_data->ifi_ierrors; network_io_ptr[interfaces].oerrors = net_data->ifi_oerrors; network_io_ptr[interfaces].collisions = net_data->ifi_collisions; network_io_ptr[interfaces].systime = time(NULL); ++interfaces; } freeifaddrs(net); #elif defined(AIX) /* check how many perfstat_netinterface_t structures are available */ interfaces = perfstat_netinterface(NULL, NULL, sizeof(perfstat_netinterface_t), 0); /* allocate enough memory for all the structures */ statp = calloc(interfaces, sizeof(perfstat_netinterface_t)); if( NULL == statp ) { RETURN_WITH_SET_ERROR("network", SG_ERROR_MALLOC, "sg_get_network_io_stats"); } #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP free(statp); /* set name to first interface */ strcpy(first.name, FIRST_NETINTERFACE); /* ask to get all the structures available in one call */ /* return code is number of structures returned */ interfaces = perfstat_netinterface(&first, statp, sizeof(perfstat_netinterface_t), interfaces); if( -1 == interfaces ) { free(statp); RETURN_WITH_SET_ERROR("network", SG_ERROR_SYSCTLBYNAME, "perfstat_netinterface"); } VECTOR_UPDATE(network_io_stats_vector_ptr, interfaces, network_io_ptr, sg_network_io_stats); /* print statistics for each of the interfaces */ for (i = 0; i < interfaces; ++i) { if (sg_update_string(&network_io_ptr[i].interface_name, statp[i].name) != SG_ERROR_NONE ) { free(statp); RETURN_FROM_PREVIOUS_ERROR( "network", sg_get_error() ); } network_io_ptr[i].tx = statp[i].obytes; network_io_ptr[i].rx = statp[i].ibytes; network_io_ptr[i].opackets = statp[i].opackets; network_io_ptr[i].ipackets = statp[i].ipackets; network_io_ptr[i].oerrors = statp[i].oerrors; network_io_ptr[i].ierrors = statp[i].ierrors; network_io_ptr[i].collisions = statp[i].collisions; network_io_ptr[i].systime = time(NULL); } free(statp); #elif defined(SOLARIS) if ((kc = kstat_open()) == NULL) { RETURN_WITH_SET_ERROR("network", SG_ERROR_KSTAT_OPEN, NULL); } #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP kstat_close(kc); for (ksp = kc->kc_chain; ksp; ksp = ksp->ks_next) { if (strcmp(ksp->ks_class, "net") == 0) { kstat_read(kc, ksp, NULL); #ifdef SOL7 # define LRX "rbytes" # define LTX "obytes" # define LIPACKETS "ipackets" # define LOPACKETS "opackets" # define VALTYPE value.ui32 #else # define LRX "rbytes64" # define LTX "obytes64" # define LIPACKETS "ipackets64" # define LOPACKETS "opackets64" # define VALTYPE value.ui64 #endif /* Read rx */ if((knp=kstat_data_lookup(ksp, LRX))==NULL){ /* This is a network interface, but it doesn't * have the rbytes/obytes values; for instance, * the loopback devices have this behaviour * (although they do track packets in/out). */ /* FIXME: Show packet counts when byte counts * not available. */ continue; } VECTOR_UPDATE(network_io_stats_vector_ptr, interfaces + 1, network_io_ptr, sg_network_io_stats); /* Read interface name */ if (SG_ERROR_NONE != sg_update_string(&network_io_ptr[interfaces].interface_name, ksp->ks_name)) { kstat_close(kc); RETURN_FROM_PREVIOUS_ERROR( "network", sg_get_error() ); } /* Finish reading rx */ network_io_ptr[interfaces].rx=knp->VALTYPE; /* Read tx */ if((knp=kstat_data_lookup(ksp, LTX))==NULL) continue; network_io_ptr[interfaces].tx=knp->VALTYPE; /* Read ipackets */ if((knp=kstat_data_lookup(ksp, LIPACKETS))==NULL) continue; network_io_ptr[interfaces].ipackets=knp->VALTYPE; /* Read opackets */ if((knp=kstat_data_lookup(ksp, LOPACKETS))==NULL) continue; network_io_ptr[interfaces].opackets=knp->VALTYPE; /* Read ierrors */ if((knp=kstat_data_lookup(ksp, "ierrors"))==NULL) continue; network_io_ptr[interfaces].ierrors=knp->value.ui32; /* Read oerrors */ if((knp=kstat_data_lookup(ksp, "oerrors"))==NULL) continue; network_io_ptr[interfaces].oerrors=knp->value.ui32; /* Read collisions */ if((knp=kstat_data_lookup(ksp, "collisions"))==NULL) continue; network_io_ptr[interfaces].collisions=knp->value.ui32; /* Store systime */ network_io_ptr[interfaces].systime=time(NULL); ++interfaces; } } kstat_close(kc); #elif defined(LINUX) f=fopen("/proc/net/dev", "r"); if(f==NULL) { RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_OPEN, "/proc/net/dev"); } #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP fclose(f); /* read the 2 lines.. Its the title, so we dont care :) */ if( ( NULL == fgets(line, sizeof(line), f) ) || ( NULL == fgets(line, sizeof(line), f) ) ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_PARSE, "/proc/net/dev"); } while((fgets(line, sizeof(line), f)) != NULL){ if((regexec(&network_io_rx, line, RX_MATCH_COUNT, line_match, 0))!=0){ continue; } VECTOR_UPDATE(network_io_stats_vector_ptr, interfaces + 1, network_io_ptr, sg_network_io_stats); if( network_io_ptr[interfaces].interface_name != NULL ) { free(network_io_ptr[interfaces].interface_name); network_io_ptr[interfaces].interface_name = NULL; } network_io_ptr[interfaces].interface_name = sg_get_string_match(line, &line_match[1]); network_io_ptr[interfaces].rx = sg_get_ll_match(line, &line_match[2]); network_io_ptr[interfaces].tx = sg_get_ll_match(line, &line_match[5]); network_io_ptr[interfaces].ipackets = sg_get_ll_match(line, &line_match[3]); network_io_ptr[interfaces].opackets = sg_get_ll_match(line, &line_match[6]); network_io_ptr[interfaces].ierrors = sg_get_ll_match(line, &line_match[4]); network_io_ptr[interfaces].oerrors = sg_get_ll_match(line, &line_match[7]); network_io_ptr[interfaces].collisions = sg_get_ll_match(line, &line_match[8]); network_io_ptr[interfaces].systime = time(NULL); ++interfaces; } fclose(f); #elif defined(WIN32) if((if_table = win32_get_devices()) == NULL) { RETURN_WITH_SET_ERROR("network", SG_ERROR_DEVICES, "win32_get_devices"); } #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP free(if_table); VECTOR_UPDATE(network_io_stats_vector_ptr, interfaces + 1, network_io_ptr, sg_network_io_stats); for ( i = 0; i < if_table->dwNumEntries; ++i ) { if_row = if_table->table[i]; if(SG_ERROR_NONE != sg_update_string(&network_io_ptr[i].interface_name, if_row.bDescr) ) { free(if_table); RETURN_FROM_PREVIOUS_ERROR( "network", sg_get_error() ); } network_io_ptr[i].tx = if_row.dwOutOctets; network_io_ptr[i].rx = if_row.dwInOctets; network_io_ptr[i].ipackets = if_row.dwInUcastPkts + if_row.dwInNUcastPkts; network_io_ptr[i].opackets = if_row.dwOutUcastPkts + if_row.dwOutNUcastPkts; network_io_ptr[i].ierrors = if_row.dwInErrors; network_io_ptr[i].oerrors = if_row.dwOutErrors; network_io_ptr[i].collisions = 0; /* can't do that */ network_io_ptr[i].systime = time(NULL); ++interfaces; } free(if_table); /* Please say there's a nicer way to do this... If windows has two (or * more) identical network cards, GetIfTable returns them with the same * name, not like in Device Manager where the other has a #2 etc after * it. So, add the #number here. Should we be doing this? Or should the * end programs be dealing with duplicate names? Currently breaks * watch.pl in rrdgraphing. But Unix does not have the issue of * duplicate net device names. */ for (i=0; i < interfaces; ++i) { int no = 2, j; for(j=i+1; jinterface_name, b->interface_name); } /* NETWORK INTERFACE STATS */ static sg_error sg_get_network_iface_stats_int(sg_vector **network_iface_vector_ptr){ sg_network_iface_stats *network_iface_stat; size_t ifaces = 0; time_t now = time(NULL); #ifdef SOLARIS kstat_ctl_t *kc; kstat_t *ksp; kstat_named_t *knp; int sock; #elif defined(ALLBSD) struct ifmediareq ifmed; struct ifaddrs *net, *net_ptr; struct ifreq ifr; int sock; #elif defined(LINUX) FILE *f; /* Horrible big enough, but it should be easily big enough */ char line[8096]; int sock; #elif defined(WIN32) PMIB_IFTABLE if_table; MIB_IFROW if_row; int i,j,no; char buf[5]; #elif defined(AIX) int fd, n; struct ifreq *ifr, *lifr, iff; struct ifconf ifc; #elif defined(HPUX) int fd; struct ifreq *ifr, *lifr, iff; struct ifconf ifc; #endif #ifdef ALLBSD if(getifaddrs(&net) != 0) { RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_GETIFADDRS, NULL); } if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == 0) { RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_SOCKET, NULL); } for( net_ptr = net; net_ptr != NULL; net_ptr = net_ptr->ifa_next ) { if( net_ptr->ifa_addr->sa_family != AF_LINK ) continue; ++ifaces; } #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP close(sock); freeifaddrs(net); VECTOR_UPDATE(network_iface_vector_ptr, ifaces, network_iface_stat, sg_network_iface_stats); for( ifaces = 0, net_ptr = net; net_ptr != NULL; net_ptr = net_ptr->ifa_next ) { if( net_ptr->ifa_addr->sa_family != AF_LINK ) continue; memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, net_ptr->ifa_name, sizeof(ifr.ifr_name)); if (ioctl(sock, SIOCGIFFLAGS, &ifr) < 0) continue; network_iface_stat[ifaces].up = ((ifr.ifr_flags & IFF_UP) != 0) ? SG_IFACE_UP : SG_IFACE_DOWN; if (sg_update_string(&network_iface_stat[ifaces].interface_name, net_ptr->ifa_name) != SG_ERROR_NONE ) { VECTOR_UPDATE_ERROR_CLEANUP RETURN_FROM_PREVIOUS_ERROR( "network", sg_get_error() ); } network_iface_stat[ifaces].speed = network_iface_stat[ifaces].factor = 0; network_iface_stat[ifaces].duplex = SG_IFACE_DUPLEX_UNKNOWN; network_iface_stat[ifaces].systime = now; memset(&ifmed, 0, sizeof(struct ifmediareq)); sg_strlcpy(ifmed.ifm_name, net_ptr->ifa_name, sizeof(ifmed.ifm_name)); if(ioctl(sock, SIOCGIFMEDIA, (caddr_t)&ifmed) == -1){ /* Not all interfaces support the media ioctls. */ goto skip; } /* We may need to change this if we start doing wireless devices too */ if( (ifmed.ifm_active | IFM_ETHER) != ifmed.ifm_active ){ /* Not a ETHER device */ goto skip; } /* Assuming only ETHER devices */ switch(IFM_TYPE(ifmed.ifm_active)) { case IFM_ETHER: switch(IFM_SUBTYPE(ifmed.ifm_active)) { #if defined(IFM_HPNA_1) && ((!defined(IFM_10G_LR)) || (IFM_10G_LR != IFM_HPNA_1)) /* HomePNA 1.0 (1Mb/s) */ case(IFM_HPNA_1): network_iface_stat[ifaces].speed = 1; break; #endif /* 10 Mbit connections. Speedy :) */ case(IFM_10_T): /* 10BaseT - RJ45 */ case(IFM_10_2): /* 10Base2 - Thinnet */ case(IFM_10_5): /* 10Base5 - AUI */ case(IFM_10_STP): /* 10BaseT over shielded TP */ case(IFM_10_FL): /* 10baseFL - Fiber */ network_iface_stat[ifaces].speed = 10; break; /* 100 Mbit connections */ case(IFM_100_TX): /* 100BaseTX - RJ45 */ case(IFM_100_FX): /* 100BaseFX - Fiber */ case(IFM_100_T4): /* 100BaseT4 - 4 pair cat 3 */ case(IFM_100_VG): /* 100VG-AnyLAN */ case(IFM_100_T2): /* 100BaseT2 */ network_iface_stat[ifaces].speed = 100; break; /* 1000 Mbit connections */ case(IFM_1000_SX): /* 1000BaseSX - multi-mode fiber */ case(IFM_1000_LX): /* 1000baseLX - single-mode fiber */ case(IFM_1000_CX): /* 1000baseCX - 150ohm STP */ #if defined(IFM_1000_TX) && !defined(OPENBSD) /* FreeBSD 4 and others (but NOT OpenBSD)? */ case(IFM_1000_TX): #endif #ifdef IFM_1000_FX case(IFM_1000_FX): #endif #ifdef IFM_1000_T case(IFM_1000_T): #endif network_iface_stat[ifaces].speed = 1000; break; #if defined(IFM_10G_SR) || defined(IFM_10G_LR) || defined(IFM_10G_CX4) || defined(IFM_10G_T) # ifdef IFM_10G_SR case(IFM_10G_SR): # endif # ifdef IFM_10G_LR case(IFM_10G_LR): # endif # ifdef IFM_10G_CX4 case(IFM_10G_CX4): # endif # ifdef IFM_10G_TWINAX case(IFM_10G_TWINAX): # endif # ifdef IFM_10G_TWINAX_LONG case(IFM_10G_TWINAX_LONG): # endif # ifdef IFM_10G_T case(IFM_10G_T): # endif network_iface_stat[ifaces].speed = 10000; break; #endif #if defined(IFM_2500_SX) # ifdef IFM_2500_SX case(IFM_2500_SX): # endif network_iface_stat[ifaces].speed = 2500; break; #endif /* any 2.5GBit stuff ...*/ /* We don't know what it is */ default: network_iface_stat[ifaces].speed = 0; break; } break; #ifdef IFM_TOKEN case IFM_TOKEN: switch(IFM_SUBTYPE(ifmed.ifm_active)) { case IFM_TOK_STP4: /* Shielded twisted pair 4m - DB9 */ case IFM_TOK_UTP4: /* Unshielded twisted pair 4m - RJ45 */ network_iface_stat[ifaces].speed = 4; break; case IFM_TOK_STP16: /* Shielded twisted pair 16m - DB9 */ case IFM_TOK_UTP16: /* Unshielded twisted pair 16m - RJ45 */ network_iface_stat[ifaces].speed = 16; break; #if defined(IFM_TOK_STP100) || defined(IFM_TOK_UTP100) # ifdef IFM_TOK_STP100 case IFM_TOK_STP100: /* Shielded twisted pair 100m - DB9 */ # endif # ifdef IFM_TOK_UTP100 case IFM_TOK_UTP100: /* Unshielded twisted pair 100m - RJ45 */ # endif network_iface_stat[ifaces].speed = 100; break; #endif /* We don't know what it is */ default: network_iface_stat[ifaces].speed = 0; break; } break; #endif #ifdef IFM_FDDI case IFM_FDDI: switch(IFM_SUBTYPE(ifmed.ifm_active)) { /* We don't know what it is */ default: network_iface_stat[ifaces].speed = 0; break; } break; #endif case IFM_IEEE80211: switch(IFM_SUBTYPE(ifmed.ifm_active)) { case IFM_IEEE80211_FH1: /* Frequency Hopping 1Mbps */ case IFM_IEEE80211_DS1: /* Direct Sequence 1Mbps */ network_iface_stat[ifaces].speed = 1; break; case IFM_IEEE80211_FH2: /* Frequency Hopping 2Mbps */ case IFM_IEEE80211_DS2: /* Direct Sequence 2Mbps */ network_iface_stat[ifaces].speed = 2; break; case IFM_IEEE80211_DS5: /* Direct Sequence 5Mbps*/ network_iface_stat[ifaces].speed = 5; break; case IFM_IEEE80211_DS11: /* Direct Sequence 11Mbps*/ network_iface_stat[ifaces].speed = 11; break; case IFM_IEEE80211_DS22: /* Direct Sequence 22Mbps */ network_iface_stat[ifaces].speed = 22; break; /* We don't know what it is */ default: network_iface_stat[ifaces].speed = 0; break; } break; default: network_iface_stat[ifaces].speed = 0; break; } network_iface_stat[ifaces].factor = 1000U * 1000U; if( (ifmed.ifm_active | IFM_FDX) == ifmed.ifm_active ) { network_iface_stat[ifaces].duplex = SG_IFACE_DUPLEX_FULL; } else if( (ifmed.ifm_active | IFM_HDX) == ifmed.ifm_active ) { network_iface_stat[ifaces].duplex = SG_IFACE_DUPLEX_HALF; } else { network_iface_stat[ifaces].duplex = SG_IFACE_DUPLEX_UNKNOWN; } skip: ++ifaces; } freeifaddrs(net); close(sock); #elif defined(AIX) /* * Fix up for variable length of struct ifr */ #ifndef _SIZEOF_ADDR_IFREQ #define _SIZEOF_ADDR_IFREQ(ifr) \ (((ifr).ifr_addr.sa_len > sizeof(struct sockaddr)) \ ? sizeof(struct ifreq) - sizeof(struct sockaddr) + (ifr).ifr_addr.sa_len \ : sizeof(struct ifreq)) #endif if( (fd = socket (PF_INET, SOCK_DGRAM, 0)) == -1 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_SOCKET, NULL); } n = 2; ifr = (struct ifreq *)malloc( n * sys_page_size ); if( NULL == ifr ) { close (fd); RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_MALLOC, NULL); } bzero(&ifc, sizeof(ifc)); ifc.ifc_req = ifr; ifc.ifc_len = n * sys_page_size; while( ( ioctl( fd, SIOCGIFCONF, &ifc ) == -1 ) || ( ((ssize_t)ifc.ifc_len) >= ( (n-1) * sys_page_size)) ) { n *= 2; if( (n * sys_page_size) > INT_MAX ) { free( ifc.ifc_req ); close (fd); RETURN_WITH_SET_ERROR_WITH_ERRNO_CODE("network", SG_ERROR_MALLOC, ERANGE, "SIOCGIFCONF"); } ifr = (struct ifreq *)realloc( ifr, n * sys_page_size ); if( NULL == ifr ) { free( ifc.ifc_req ); close (fd); RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_MALLOC, NULL); } ifc.ifc_req = ifr; ifc.ifc_len = n * sys_page_size; } lifr = (struct ifreq *)&ifc.ifc_buf[ifc.ifc_len]; for ( ifr = ifc.ifc_req; ifr < lifr; ifr = (struct ifreq *)&(((char *)ifr)[_SIZEOF_ADDR_IFREQ(*ifr)]) ) { struct sockaddr *sa = &ifr->ifr_addr; if(sa->sa_family != AF_LINK) continue; ++ifaces; } #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP close(fd); free(ifc.ifc_req); VECTOR_UPDATE(network_iface_vector_ptr, ifaces, network_iface_stat, sg_network_iface_stats); for ( ifaces = 0, ifr = ifc.ifc_req; ifr < lifr; ifr = (struct ifreq *)&(((char *)ifr)[_SIZEOF_ADDR_IFREQ(*ifr)]) ) { struct sockaddr *sa = &ifr->ifr_addr; if(sa->sa_family != AF_LINK) continue; memset(&iff, 0, sizeof(iff)); strncpy(iff.ifr_name, ifr->ifr_name, sizeof(iff.ifr_name)); if (ioctl(fd, SIOCGIFFLAGS, &iff) < 0) continue; network_iface_stat[ifaces].up = ((iff.ifr_flags & IFF_UP) != 0) ? SG_IFACE_UP : SG_IFACE_DOWN; if (sg_update_string(&network_iface_stat[ifaces].interface_name, ifr->ifr_name) != SG_ERROR_NONE ) { close (fd); free( ifc.ifc_req ); RETURN_FROM_PREVIOUS_ERROR( "network", sg_get_error() ); } network_iface_stat[ifaces].speed = 0; network_iface_stat[ifaces].factor = 0; /* XXX */ network_iface_stat[ifaces].duplex = SG_IFACE_DUPLEX_UNKNOWN; network_iface_stat[ifaces].systime = now; ++ifaces; } close (fd); free( ifc.ifc_req ); #elif defined(HPUX) /* * Fix up for variable length of struct ifr */ #ifndef _SA_LEN #define _SA_LEN(sa) \ ((sa).sa_family == AF_UNIX ? sizeof(struct sockaddr_un) : \ (sa).sa_family == AF_INET6 ? sizeof(struct sockaddr_in6) : \ sizeof(struct sockaddr)) #endif #ifndef _SIZEOF_ADDR_IFREQ #define _SIZEOF_ADDR_IFREQ(ifr) \ ((_SA_LEN((ifr).ifr_addr) > sizeof(struct sockaddr)) \ ? sizeof(struct ifreq) - sizeof(struct sockaddr) + _SA_LEN((ifr).ifr_addr) \ : sizeof(struct ifreq)) #endif if ((fd = socket (PF_INET, SOCK_DGRAM, 0)) == -1) { RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_SOCKET, NULL); } bzero(&ifc, sizeof(ifc)); if (ioctl (fd, SIOCGIFNUM, &ifc) != -1) { ifr = calloc(sizeof (*ifr), ifc.ifc_len); if( NULL == ifr ) { close (fd); RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_MALLOC, NULL); } ifc.ifc_req = ifr; ifc.ifc_len *= sizeof (*ifr); if (ioctl (fd, SIOCGIFCONF, &ifc) == -1) { free (ifr); close (fd); RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_GETIFADDRS, NULL); } } else { close (fd); RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_GETIFADDRS, NULL); } #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP close(fd); free(ifc.ifc_req); lifr = (struct ifreq *)((void *)(&ifc.ifc_buf[ifc.ifc_len])); for ( ifr = ifc.ifc_req; ifr < lifr; ifr = (struct ifreq *)((void *)(((char *)ifr) + _SIZEOF_ADDR_IFREQ(*ifr))) ) { VECTOR_UPDATE(network_iface_vector_ptr, ifaces + 1, network_iface_stat, sg_network_iface_stats); bzero(&iff, sizeof(iff)); strncpy(iff.ifr_name, ifr->ifr_name, sizeof(iff.ifr_name)); if (ioctl(fd, SIOCGIFFLAGS, &iff) < 0) { continue; } network_iface_stat[ifaces].up = ((iff.ifr_flags & IFF_UP) != 0) ? SG_IFACE_UP : SG_IFACE_DOWN; if (sg_update_string(&network_iface_stat[ifaces].interface_name, ifr->ifr_name) != SG_ERROR_NONE ) { close (fd); free( ifc.ifc_req ); RETURN_FROM_PREVIOUS_ERROR( "network", sg_get_error() ); } /** * for physical devices we now could ask /dev/dlpi for speed and type, * but for monitoring we don't care */ network_iface_stat[ifaces].speed = 0; network_iface_stat[ifaces].factor = 0; network_iface_stat[ifaces].duplex = SG_IFACE_DUPLEX_UNKNOWN; network_iface_stat[ifaces].systime = now; ++ifaces; } close (fd); free( ifc.ifc_req ); #elif defined(SOLARIS) if ((kc = kstat_open()) == NULL) { RETURN_WITH_SET_ERROR("network", SG_ERROR_KSTAT_OPEN, NULL); } if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP)) < 0) { kstat_close(kc); RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_SOCKET, NULL); } #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP close(sock); kstat_close(kc); for (ksp = kc->kc_chain; ksp; ksp = ksp->ks_next) { if (strcmp(ksp->ks_class, "net") == 0) { struct ifreq ifr; kstat_read(kc, ksp, NULL); strncpy(ifr.ifr_name, ksp->ks_name, sizeof(ifr.ifr_name)); if (ioctl(sock, SIOCGIFFLAGS, &ifr) < 0) { /* Not a network interface. */ continue; } VECTOR_UPDATE(network_iface_vector_ptr, ifaces + 1, network_iface_stat, sg_network_iface_stats); if (sg_update_string(&network_iface_stat[ifaces].interface_name, ksp->ks_name) != SG_ERROR_NONE ) { VECTOR_UPDATE_ERROR_CLEANUP RETURN_FROM_PREVIOUS_ERROR( "network", sg_get_error() ); } if ((ifr.ifr_flags & IFF_UP) != 0) { if ((knp = kstat_data_lookup(ksp, "link_up")) != NULL) { /* take in to account if link * is up as well as interface */ network_iface_stat[ifaces].up = (knp->value.ui32 != 0u) ? SG_IFACE_UP : SG_IFACE_DOWN; } else { /* maintain compatibility */ network_iface_stat[ifaces].up = SG_IFACE_UP; } } else { network_iface_stat[ifaces].up = SG_IFACE_DOWN; } if ((knp = kstat_data_lookup(ksp, "ifspeed")) != NULL) { network_iface_stat[ifaces].factor = 1000U * 1000U; network_iface_stat[ifaces].speed = knp->value.ui64 / network_iface_stat[ifaces].factor; } else { network_iface_stat[ifaces].speed = network_iface_stat[ifaces].factor = 0; } network_iface_stat[ifaces].duplex = SG_IFACE_DUPLEX_UNKNOWN; if ((knp = kstat_data_lookup(ksp, "link_duplex")) != NULL) { switch (knp->value.ui32) { case 1: network_iface_stat[ifaces].duplex = SG_IFACE_DUPLEX_HALF; break; case 2: network_iface_stat[ifaces].duplex = SG_IFACE_DUPLEX_FULL; break; } } network_iface_stat[ifaces].systime = now; ++ifaces; } } close(sock); kstat_close(kc); #elif defined(LINUX) f = fopen("/proc/net/dev", "r"); if(f == NULL) { RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_OPEN, "/proc/net/dev"); } /* Setup stuff so we can do the ioctl to get the info */ if((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { fclose(f); RETURN_WITH_SET_ERROR_WITH_ERRNO("network", SG_ERROR_SOCKET, NULL); } #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP close(sock); fclose(f); /* Ignore first 2 lines.. Just headings */ if((fgets(line, sizeof(line), f)) == NULL) { VECTOR_UPDATE_ERROR_CLEANUP RETURN_WITH_SET_ERROR("network", SG_ERROR_PARSE, NULL); } if((fgets(line, sizeof(line), f)) == NULL) { VECTOR_UPDATE_ERROR_CLEANUP RETURN_WITH_SET_ERROR("network", SG_ERROR_PARSE, NULL); } while((fgets(line, sizeof(line), f)) != NULL){ char *name, *ptr; struct ifreq ifr; struct ethtool_cmd ethcmd; int err; /* Get the interface name */ ptr = strchr(line, ':'); if (ptr == NULL) continue; *ptr='\0'; name = line; while(isspace(*(name))){ ++name; } memset(&ifr, 0, sizeof ifr); strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name); if (ioctl(sock, SIOCGIFFLAGS, &ifr) < 0) { continue; } /* We have a good interface to add */ VECTOR_UPDATE(network_iface_vector_ptr, ifaces + 1, network_iface_stat, sg_network_iface_stats); if (sg_update_string(&network_iface_stat[ifaces].interface_name, name) != SG_ERROR_NONE ) { VECTOR_UPDATE_ERROR_CLEANUP RETURN_FROM_PREVIOUS_ERROR( "network", sg_get_error() ); } network_iface_stat[ifaces].up = ((ifr.ifr_flags & IFF_UP) != 0) ? SG_IFACE_UP : SG_IFACE_DOWN; memset(ðcmd, 0, sizeof ethcmd); ethcmd.cmd = ETHTOOL_GSET; ifr.ifr_data = (caddr_t) ðcmd; err = ioctl(sock, SIOCETHTOOL, &ifr); if (err == 0) { #ifdef HAVE_ETHTOOL_CMD_SPEED_HI network_iface_stat[ifaces].speed = ethtool_cmd_speed(ðcmd); #else switch(ethcmd.speed) { case SPEED_10: network_iface_stat[ifaces].speed = 10; case SPEED_100: network_iface_stat[ifaces].speed = 100; case SPEED_1000: network_iface_stat[ifaces].speed = 1000; case SPEED_2500: network_iface_stat[ifaces].speed = 2500; case SPEED_10000: network_iface_stat[ifaces].speed = 10000; /* We don't know what it is */ default: network_iface_stat[ifaces].speed = 0; break; } #endif network_iface_stat[ifaces].factor = 1000U * 1000U; switch (ethcmd.duplex) { case DUPLEX_FULL: network_iface_stat[ifaces].duplex = SG_IFACE_DUPLEX_FULL; break; case DUPLEX_HALF: network_iface_stat[ifaces].duplex = SG_IFACE_DUPLEX_HALF; break; default: network_iface_stat[ifaces].duplex = SG_IFACE_DUPLEX_UNKNOWN; } } else { /* Not all interfaces support the ethtool ioctl. */ network_iface_stat[ifaces].speed = 0; network_iface_stat[ifaces].factor = 0; network_iface_stat[ifaces].duplex = SG_IFACE_DUPLEX_UNKNOWN; } network_iface_stat[ifaces].systime = now; ++ifaces; } close(sock); fclose(f); #elif defined(WIN32) if((if_table = win32_get_devices()) == NULL) { RETURN_WITH_SET_ERROR("network", SG_ERROR_DEVICES, "network interfaces"); } #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP free(if_table); VECTOR_UPDATE(network_iface_vector_ptr, if_table->dwNumEntries, network_iface_stat, sg_network_iface_stats); for( i = 0; i < if_table->dwNumEntries; ++i ) { if_row = if_table->table[i]; if(sg_update_string(&network_iface_stat[i].interface_name, if_row.bDescr) != SG_ERROR_NONE ) { VECTOR_UPDATE_ERROR_CLEANUP RETURN_FROM_PREVIOUS_ERROR( "network", sg_get_error() ); } network_iface_stat[ifaces].factor = 1000U * 1000U; network_iface_stat[i].speed = if_row.dwSpeed / network_iface_stat[ifaces].factor; if( ( if_row.dwOperStatus == MIB_IF_OPER_STATUS_CONNECTED || if_row.dwOperStatus == MIB_IF_OPER_STATUS_OPERATIONAL ) && if_row.dwAdminStatus == 1 ) { network_iface_stat[i].up = SG_IFACE_UP; } else { network_iface_stat[i].up = SG_IFACE_DOWN; } network_iface_stat[i].systime = now; ++ifaces; } free(if_table); /* again with the renumbering */ for (i=0; i < ifaces; ++i) { int no = 2, j; for(j=i+1; jinterface_name, b->interface_name); } libstatgrab-0.90/src/libstatgrab/memory_stats.c000644 001750 001750 00000033107 12200025312 021662 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #define __NEED_SG_GET_SYS_PAGE_SIZE #include "tools.h" EXTENDED_COMP_SETUP(mem,1,NULL); #if defined(HAVE_STRUCT_VMTOTAL) && \ !(defined(HAVE_STRUCT_UVMEXP_SYSCTL) && defined(VM_UVMEXP2)) && \ !(defined(HAVE_STRUCT_UVMEXP) && defined(VM_UVMEXP)) && \ !defined(DARWIN) static int vmtotal_mib[2]; #endif #if defined(HAVE_HOST_STATISTICS) || defined(HAVE_HOST_STATISTICS64) static mach_port_t self_host_port; #endif static sg_error sg_mem_init_comp(unsigned id) { ssize_t pagesize; #if defined(HAVE_STRUCT_VMTOTAL) && \ !(defined(HAVE_STRUCT_UVMEXP_SYSCTL) && defined(VM_UVMEXP2)) && \ !(defined(HAVE_STRUCT_UVMEXP) && defined(VM_UVMEXP)) && \ !defined(DARWIN) size_t len = lengthof(vmtotal_mib); #endif GLOBAL_SET_ID(mem,id); #if defined(HAVE_STRUCT_VMTOTAL) && \ !(defined(HAVE_STRUCT_UVMEXP_SYSCTL) && defined(VM_UVMEXP2)) && \ !(defined(HAVE_STRUCT_UVMEXP) && defined(VM_UVMEXP)) && \ !defined(DARWIN) if( -1 == sysctlnametomib( "vm.vmtotal", vmtotal_mib, &len ) ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("mem", SG_ERROR_SYSCTLNAMETOMIB, "vm.vmtotal"); } #endif if((pagesize = sg_get_sys_page_size()) == -1) { RETURN_WITH_SET_ERROR_WITH_ERRNO("mem", SG_ERROR_SYSCONF, "_SC_PAGESIZE"); } #if defined(HAVE_HOST_STATISTICS) || defined(HAVE_HOST_STATISTICS64) self_host_port = mach_host_self(); #endif return SG_ERROR_NONE; } EASY_COMP_DESTROY_FN(mem) EASY_COMP_CLEANUP_FN(mem,1) static sg_error sg_get_mem_stats_int(sg_mem_stats *mem_stats_buf) { #ifdef HPUX struct pst_static pstat_static; struct pst_dynamic pstat_dynamic; #elif defined(SOLARIS) # ifdef _SC_PHYS_PAGES long phystotal; long physav; # else kstat_ctl_t *kc; kstat_t *ksp; kstat_named_t *kn; # endif #elif defined(LINUX) || defined(CYGWIN) #define LINE_BUF_SIZE 256 char *line_ptr, line_buf[LINE_BUF_SIZE]; long long value; FILE *f; #elif defined(HAVE_HOST_STATISTICS) || defined(HAVE_HOST_STATISTICS64) # if defined(HAVE_HOST_STATISTICS64) struct vm_statistics64 vm_stats; # else struct vm_statistics vm_stats; # endif mach_msg_type_number_t count; kern_return_t rc; #elif defined(HAVE_STRUCT_UVMEXP_SYSCTL) && defined(VM_UVMEXP2) int mib[2]; struct uvmexp_sysctl uvm; size_t size = sizeof(uvm); #elif defined(HAVE_STRUCT_UVMEXP) && defined(VM_UVMEXP) int mib[2]; struct uvmexp uvm; size_t size = sizeof(uvm); #elif defined(FREEBSD) || defined(DFBSD) size_t size; unsigned int total_count; unsigned int free_count; unsigned int cache_count; unsigned int inactive_count; #elif defined(HAVE_STRUCT_VMTOTAL) struct vmtotal vmtotal; size_t size; #if defined(HW_PHYSMEM) || defined(HW_USERMEM) int mib[2]; # if defined(HW_PHYSMEM) u_long total_mem; # endif # if defined(HW_USERMEM) u_long user_mem; # endif #endif #elif defined(AIX) perfstat_memory_total_t mem; #elif defined(WIN32) MEMORYSTATUSEX memstats; #endif #if defined(HPUX) if (pstat_getdynamic(&pstat_dynamic, sizeof(pstat_dynamic), 1, 0) == -1) { RETURN_WITH_SET_ERROR_WITH_ERRNO("mem", SG_ERROR_PSTAT, "pstat_dynamic"); } /* * from man pstat_getstatic: * * pstat_getstatic() returns information about the system. Although * this data usually does not change frequently, it may change while * the system is running due to manually or automatically generated * administrative changes in the associated kernel tunables, online * addition/deletion of resources, or other events. There is one * global instance of this context. * * ==> Can't hold this value globally static. */ if( pstat_getstatic(&pstat_static, sizeof(pstat_static), 1, 0) == -1 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("mem", SG_ERROR_PSTAT, "pstat_static"); } mem_stats_buf->total = ((long long) pstat_static.physical_memory) * pstat_static.page_size; mem_stats_buf->free = ((long long) pstat_dynamic.psd_free) * pstat_static.page_size; mem_stats_buf->used = mem_stats_buf->total - mem_stats_buf->free; #elif defined(AIX) /* return code is number of structures returned */ if(perfstat_memory_total(NULL, &mem, sizeof(perfstat_memory_total_t), 1) != 1) { RETURN_WITH_SET_ERROR_WITH_ERRNO("mem", SG_ERROR_SYSCTLBYNAME, "perfstat_memory_total"); } mem_stats_buf->total = (unsigned long long) mem.real_total; mem_stats_buf->total *= sys_page_size; mem_stats_buf->used = (unsigned long long) mem.real_inuse; mem_stats_buf->used *= sys_page_size; mem_stats_buf->cache = (unsigned long long) mem.numperm; mem_stats_buf->cache *= sys_page_size; mem_stats_buf->free = (unsigned long long) mem.real_free; mem_stats_buf->free *= sys_page_size; #elif defined(SOLARIS) # ifdef _SC_PHYS_PAGES if( ( phystotal = sysconf(_SC_PHYS_PAGES) ) < 0 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("mem", SG_ERROR_SYSCONF, "_SC_PHYS_PAGES"); } if( ( physav = sysconf(_SC_AVPHYS_PAGES) ) < 0 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("mem", SG_ERROR_SYSCONF, "_SC_AVPHYS_PAGES"); } mem_stats_buf->total = ((unsigned long long)phystotal) * ((unsigned long long)sys_page_size); mem_stats_buf->free = ((unsigned long long)physav) * ((unsigned long long)sys_page_size); # else if( (kc = kstat_open()) == NULL ) { RETURN_WITH_SET_ERROR("mem", SG_ERROR_KSTAT_OPEN, NULL); } if((ksp=kstat_lookup(kc, "unix", 0, "system_pages")) == NULL) { RETURN_WITH_SET_ERROR("mem", SG_ERROR_KSTAT_LOOKUP, "unix,0,system_pages"); } if (kstat_read(kc, ksp, 0) == -1) { RETURN_WITH_SET_ERROR("mem", SG_ERROR_KSTAT_READ, NULL); } if((kn=kstat_data_lookup(ksp, "physmem")) == NULL) { RETURN_WITH_SET_ERROR("mem", SG_ERROR_KSTAT_DATA_LOOKUP, "physmem"); } mem_stats_buf->total = ((unsigned long long)kn->value.ul) * ((unsigned long long)sys_page_size); if((kn=kstat_data_lookup(ksp, "freemem")) == NULL) { RETURN_WITH_SET_ERROR("mem", SG_ERROR_KSTAT_DATA_LOOKUP, "freemem"); } mem_stats_buf->free = ((unsigned long long)kn->value.ul) * ((unsigned long long)sys_page_size); kstat_close(kc); # endif mem_stats_buf->used = mem_stats_buf->total - mem_stats_buf->free; mem_stats_buf->cache = 0; #elif defined(LINUX) || defined(CYGWIN) if ((f = fopen("/proc/meminfo", "r")) == NULL) { RETURN_WITH_SET_ERROR_WITH_ERRNO("mem", SG_ERROR_OPEN, "/proc/meminfo"); } #define MEM_TOTAL_PREFIX "MemTotal:" #define MEM_FREE_PREFIX "MemFree:" #define MEM_CACHED_PREFIX "Cached:" while ((line_ptr = fgets(line_buf, sizeof(line_buf), f)) != NULL) { if ( sscanf(line_buf, "%*s %lld kB", &value) != 1) continue; if (strncmp(line_buf, MEM_TOTAL_PREFIX, sizeof(MEM_TOTAL_PREFIX) - 1) == 0) mem_stats_buf->total = value; else if (strncmp(line_buf, MEM_FREE_PREFIX, sizeof(MEM_FREE_PREFIX) - 1) == 0) mem_stats_buf->free = value; else if (strncmp(line_buf, MEM_CACHED_PREFIX, sizeof(MEM_CACHED_PREFIX) - 1) == 0) mem_stats_buf->cache = value; } mem_stats_buf->free += mem_stats_buf->cache; mem_stats_buf->total *= 1024; mem_stats_buf->free *= 1024; mem_stats_buf->cache *= 1024; #undef MEM_TOTAL_PREFIX #undef MEM_FREE_PREFIX #undef MEM_CACHED_PREFIX fclose(f); mem_stats_buf->used = mem_stats_buf->total - mem_stats_buf->free; #elif defined(HAVE_STRUCT_UVMEXP_SYSCTL) && defined(VM_UVMEXP2) mib[0] = CTL_VM; mib[1] = VM_UVMEXP2; if (sysctl(mib, 2, &uvm, &size, NULL, 0) < 0) { RETURN_WITH_SET_ERROR_WITH_ERRNO("mem", SG_ERROR_SYSCTL, "CTL_VM.VM_UVMEXP2"); } mem_stats_buf->total = uvm.npages; mem_stats_buf->cache = uvm.filepages + uvm.execpages; mem_stats_buf->free = uvm.free + mem_stats_buf->cache; mem_stats_buf->total *= uvm.pagesize; mem_stats_buf->cache *= uvm.pagesize; mem_stats_buf->free *= uvm.pagesize; mem_stats_buf->used = mem_stats_buf->total - mem_stats_buf->free; #elif defined(HAVE_STRUCT_UVMEXP) && defined(VM_UVMEXP) mib[0] = CTL_VM; mib[1] = VM_UVMEXP; if (sysctl(mib, 2, &uvm, &size, NULL, 0) < 0) { RETURN_WITH_SET_ERROR_WITH_ERRNO("mem", SG_ERROR_SYSCTL, "CTL_VM.VM_UVMEXP"); } mem_stats_buf->total = uvm.npages; mem_stats_buf->cache = 0; # if defined(HAVE_STRUCT_UVMEXP_FILEPAGES) mem_stats_buf->cache += uvm.filepages; # endif # if defined(HAVE_STRUCT_UVMEXP_EXECPAGES) mem_stats_buf->cache += uvm.execpages; # endif mem_stats_buf->free = uvm.free + mem_stats_buf->cache; mem_stats_buf->total *= uvm.pagesize; mem_stats_buf->cache *= uvm.pagesize; mem_stats_buf->free *= uvm.pagesize; mem_stats_buf->used = mem_stats_buf->total - mem_stats_buf->free; #elif defined(HAVE_HOST_STATISTICS) || defined(HAVE_HOST_STATISTICS64) # if defined(HAVE_HOST_STATISTICS64) count = HOST_VM_INFO64_COUNT; rc = host_statistics64(self_host_port, HOST_VM_INFO64, (host_info64_t)(&vm_stats), &count); # else count = HOST_VM_INFO_COUNT; rc = host_statistics(self_host_port, HOST_VM_INFO, (host_info_t)(&vm_stats), &count); # endif if( rc != KERN_SUCCESS ) { RETURN_WITH_SET_ERROR_WITH_ERRNO_CODE( "mem", SG_ERROR_MACHCALL, rc, "host_statistics" ); } /* * XXX check host_info(host_basic_info) ... for memory_size */ mem_stats_buf->free = vm_stats.free_count - vm_stats.speculative_count; mem_stats_buf->free += vm_stats.inactive_count; mem_stats_buf->free *= (size_t)sys_page_size; mem_stats_buf->total = vm_stats.active_count + vm_stats.wire_count + vm_stats.inactive_count + vm_stats.free_count; mem_stats_buf->total *= (size_t)sys_page_size; mem_stats_buf->used = mem_stats_buf->total - mem_stats_buf->free; mem_stats_buf->cache = 0; #elif defined(FREEBSD) || defined(DFBSD) /*returns pages*/ size = sizeof(total_count); if (sysctlbyname("vm.stats.vm.v_page_count", &total_count, &size, NULL, 0) < 0) { RETURN_WITH_SET_ERROR_WITH_ERRNO("mem", SG_ERROR_SYSCTLBYNAME, "vm.stats.vm.v_page_count"); } /*returns pages*/ size = sizeof(free_count); if (sysctlbyname("vm.stats.vm.v_free_count", &free_count, &size, NULL, 0) < 0) { RETURN_WITH_SET_ERROR_WITH_ERRNO("mem", SG_ERROR_SYSCTLBYNAME, "vm.stats.vm.v_free_count"); } size = sizeof(inactive_count); if (sysctlbyname("vm.stats.vm.v_inactive_count", &inactive_count , &size, NULL, 0) < 0) { RETURN_WITH_SET_ERROR_WITH_ERRNO("mem", SG_ERROR_SYSCTLBYNAME, "vm.stats.vm.v_inactive_count"); } size = sizeof(cache_count); if (sysctlbyname("vm.stats.vm.v_cache_count", &cache_count, &size, NULL, 0) < 0) { RETURN_WITH_SET_ERROR_WITH_ERRNO("mem", SG_ERROR_SYSCTLBYNAME, "vm.stats.vm.v_cache_count"); } /* Of couse nothing is ever that simple :) And I have inactive pages to * deal with too. So I'm going to add them to free memory :) */ mem_stats_buf->cache = (size_t)cache_count; mem_stats_buf->cache *= (size_t)sys_page_size; mem_stats_buf->total = (size_t)total_count; mem_stats_buf->total *= (size_t)sys_page_size; mem_stats_buf->free = (size_t)free_count + inactive_count + cache_count; mem_stats_buf->free *= (size_t)sys_page_size; mem_stats_buf->used = mem_stats_buf->total - mem_stats_buf->free; #elif defined(WIN32) memstats.dwLength = sizeof(memstats); if (!GlobalMemoryStatusEx(&memstats)) { RETURN_WITH_SET_ERROR_WITH_ERRNO("mem", SG_ERROR_MEMSTATUS, NULL); } mem_stats_buf->free = memstats.ullAvailPhys; mem_stats_buf->total = memstats.ullTotalPhys; mem_stats_buf->used = mem_stat.total - mem_stat.free; if(read_counter_large(SG_WIN32_MEM_CACHE, &mem_stats_buf->cache)) mem_stats_buf->cache = 0; #elif defined(HAVE_STRUCT_VMTOTAL) /* The code in this section is based on the code in the OpenBSD * top utility, located at src/usr.bin/top/machine.c in the * OpenBSD source tree. * * For fun, and like OpenBSD top, we will do the multiplication * converting the memory stats in pages to bytes in base 2. */ size = sizeof(vmtotal); if (sysctl(vmtotal_mib, 2, &vmtotal, &size, NULL, 0) < 0) { RETURN_WITH_SET_ERROR_WITH_ERRNO("mem", SG_ERROR_SYSCTLBYNAME, "vm.vmtotal"); } /* Convert the raw stats to bytes, and return these to the caller */ mem_stats_buf->used = (unsigned long long)vmtotal.t_rm; /* total real mem in use */ mem_stats_buf->used *= sys_page_size; /* XXX scan top source to look how it determines cache size */ mem_stats_buf->cache = 0; /* no cache stats */ mem_stats_buf->free = (unsigned long long)vmtotal.t_free; /* free memory pages */ mem_stats_buf->free *= sys_page_size; # ifdef HW_PHYSMEM mib[0] = CTL_HW; mib[1] = HW_PHYSMEM; size = sizeof(total_mem); if (sysctl(mib, 2, &total_mem, &size, NULL, 0) < 0) { RETURN_WITH_SET_ERROR_WITH_ERRNO("mem", SG_ERROR_SYSCTL, "CTL_HW.HW_PHYSMEM"); } mem_stats_buf->total = total_mem; # else mem_stats_buf->total = (mem_stats_buf->used + mem_stats_buf->free); # endif # ifdef HW_USERMEM mib[0] = CTL_HW; mib[1] = HW_USERMEM; size = sizeof(user_mem); if (sysctl(mib, 2, &user_mem, &size, NULL, 0) < 0) { RETURN_WITH_SET_ERROR_WITH_ERRNO("mem", SG_ERROR_SYSCTL, "CTL_HW.HW_USERMEM"); } mem_stats_buf->used += total_mem - user_mem; # endif #else RETURN_WITH_SET_ERROR("mem", SG_ERROR_UNSUPPORTED, OS_TYPE); #endif mem_stats_buf->systime = time(NULL); return SG_ERROR_NONE; } VECTOR_INIT_INFO_EMPTY_INIT(sg_mem_stats); #define SG_MEM_CUR_IDX 0 EASY_COMP_ACCESS(sg_get_mem_stats,mem,mem,SG_MEM_CUR_IDX) libstatgrab-0.90/src/libstatgrab/load_stats.c000644 001750 001750 00000007030 12200025312 021265 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #include "tools.h" static sg_error sg_get_load_stats_int(sg_load_stats *load_stats_buf){ #ifdef HAVE_GETLOADAVG double loadav[3]; #elif defined(HPUX) struct pst_dynamic pstat_dynamic; #elif defined(AIX) perfstat_cpu_total_t all_cpu_info; int rc; #elif defined(SOLARIS) && !defined(HAVE_SYS_LOADAVG_H) kstat_ctl_t *kc; kstat_t *ksp; kstat_named_t *kn; #endif load_stats_buf->min1 = load_stats_buf->min5 = load_stats_buf->min15 = 0; #ifdef HAVE_GETLOADAVG getloadavg(loadav,3); load_stats_buf->min1=loadav[0]; load_stats_buf->min5=loadav[1]; load_stats_buf->min15=loadav[2]; #elif defined(SOLARIS) if ((kc = kstat_open()) == NULL) { RETURN_WITH_SET_ERROR("load", SG_ERROR_KSTAT_OPEN, NULL); } if((ksp=kstat_lookup(kc, "unix", 0, "system_misc")) == NULL){ kstat_close(kc); RETURN_WITH_SET_ERROR("load", SG_ERROR_KSTAT_LOOKUP, "unix,0,system_misc"); } if (kstat_read(kc, ksp, 0) == -1) { kstat_close(kc); RETURN_WITH_SET_ERROR("load", SG_ERROR_KSTAT_READ, NULL); } kstat_close(kc); if((kn=kstat_data_lookup(ksp, "avenrun_1min")) == NULL) { RETURN_WITH_SET_ERROR("load", SG_ERROR_KSTAT_DATA_LOOKUP, "avenrun_1min"); } load_stats_buf->min1 = (double)kn->value.ui32 / (double)256; if((kn=kstat_data_lookup(ksp, "avenrun_5min")) == NULL) { RETURN_WITH_SET_ERROR("load", SG_ERROR_KSTAT_DATA_LOOKUP, "avenrun_5min"); } load_stats_buf->min5 = (double)kn->value.ui32 / (double)256; if((kn=kstat_data_lookup(ksp, "avenrun_15min")) == NULL) { RETURN_WITH_SET_ERROR("load", SG_ERROR_KSTAT_DATA_LOOKUP, "avenrun_15min"); } load_stats_buf->min15 = (double)kn->value.ui32 / (double)256; #elif defined(HPUX) if (pstat_getdynamic(&pstat_dynamic, sizeof(pstat_dynamic), 1, 0) == -1) { RETURN_WITH_SET_ERROR_WITH_ERRNO("load", SG_ERROR_PSTAT, "pstat_dynamic"); } load_stats_buf->min1=pstat_dynamic.psd_avg_1_min; load_stats_buf->min5=pstat_dynamic.psd_avg_5_min; load_stats_buf->min15=pstat_dynamic.psd_avg_15_min; #elif defined(AIX) rc = perfstat_cpu_total( NULL, &all_cpu_info, sizeof(all_cpu_info), 1); if( -1 == rc ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("load", SG_ERROR_PSTAT, "perfstat_cpu_total"); } else { load_stats_buf->min1 = (double) all_cpu_info.loadavg[0] / (double)(1 << SBITS); load_stats_buf->min5 = (double) all_cpu_info.loadavg[1] / (double)(1 << SBITS); load_stats_buf->min15 = (double) all_cpu_info.loadavg[2] / (double)(1 << SBITS); } #else RETURN_WITH_SET_ERROR("load", SG_ERROR_UNSUPPORTED, OS_TYPE); #endif load_stats_buf->systime = time(NULL); return SG_ERROR_NONE; } EASY_COMP_SETUP(load,1,NULL); VECTOR_INIT_INFO_EMPTY_INIT(sg_load_stats); #define SG_LOAD_CUR_IDX 0 EASY_COMP_ACCESS(sg_get_load_stats,load,load,SG_LOAD_CUR_IDX) libstatgrab-0.90/src/libstatgrab/Makefile.am000644 001750 001750 00000001221 12200025312 021014 0ustar00tdbusers000000 000000 # Makefile for libstatgrab/src/libstatgrab # http://www.i-scream.org/libstatgrab/ # $Id$ AM_CPPFLAGS = $(PTHREAD_CFLAGS) -DBUILD_LIBSTATGRAB @CLIBFLAGS@ include_HEADERS = statgrab.h lib_LTLIBRARIES = libstatgrab.la libstatgrab_la_LDFLAGS = -version-info 9:0:0 @LINKFLAGS@ if MINGW libstatgrab_la_MINGWSOURCES = win32.c endif libstatgrab_la_SOURCES = cpu_stats.c disk_stats.c load_stats.c memory_stats.c network_stats.c os_info.c page_stats.c process_stats.c swap_stats.c user_stats.c \ tools.c vector.c error.c globals.c $(libstatgrab_la_MINGWSOURCES) noinst_HEADERS = error.h globals.h trace.h tools.h vector.h win32.h EXTRA_DIST = statgrab.h.in libstatgrab-0.90/src/libstatgrab/tools.c000644 001750 001750 00000042505 12200025312 020276 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #include "tools.h" #if defined(SOLARIS) && defined(HAVE_LIBDEVINFO_H) struct map{ char *bsd; char *svr; struct map *next; }; typedef struct map mapping_t; static mapping_t *mapping = NULL; #endif #ifdef SOLARIS const char *sg_get_svr_from_bsd(const char *bsd){ #ifdef HAVE_LIBDEVINFO_H mapping_t *map_ptr; for(map_ptr = mapping; map_ptr != NULL; map_ptr = map_ptr->next) if(!strcmp(map_ptr->bsd, bsd)) return map_ptr->svr; #endif return bsd; } #endif #if defined(SOLARIS) && defined(HAVE_LIBDEVINFO_H) static void add_mapping(char *bsd, char *svr){ mapping_t *map_ptr = NULL; /* get rid of wrong "might uninitialized" warning */ if( mapping == NULL ) { mapping = sg_malloc(sizeof(mapping_t)); if (mapping == NULL) return; map_ptr = mapping; } else { mapping_t *map_end_ptr = map_ptr; /* get rid of wrong "might uninitialized" warning */ /* See if its already been added */ for(map_ptr = mapping; map_ptr != NULL; map_ptr = map_ptr->next){ if( (0 == strcmp(map_ptr->bsd, bsd)) || (0 == strcmp(map_ptr->svr, svr)) ){ return; } map_end_ptr = map_ptr; } /* We've reached end of list and not found the entry.. So we need to malloc * new mapping_t */ map_end_ptr->next = sg_malloc(sizeof(mapping_t)); if (map_end_ptr->next == NULL) return; map_ptr = map_end_ptr->next; } map_ptr->next = NULL; map_ptr->bsd = NULL; map_ptr->svr = NULL; if( ( SG_ERROR_NONE != sg_update_string(&map_ptr->bsd, bsd) ) || ( SG_ERROR_NONE != sg_update_string(&map_ptr->svr, svr) ) ) { char *buf = NULL; ERROR_LOG_FMT("tools", "add_mapping(): %s", sg_strperror(&buf, NULL)); free(buf); return; } return; } static char * read_dir(char *disk_path){ DIR *dirp; struct dirent *dp; struct stat stbuf; char *svr_name = NULL; char current_dir[MAXPATHLEN]; char file_name[MAXPATHLEN]; char temp_name[MAXPATHLEN]; char dir_dname[MAXPATHLEN]; char *dsk_dir; int x; dsk_dir = "/dev/osa/dev/dsk"; strncpy(current_dir, dsk_dir, sizeof current_dir); if ((dirp = opendir(current_dir)) == NULL){ dsk_dir = "/dev/dsk"; snprintf(current_dir, sizeof current_dir, "%s", dsk_dir); if ((dirp = opendir(current_dir)) == NULL){ SET_ERROR_WITH_ERRNO( "tools", SG_ERROR_OPENDIR, "open_dir(dsk_dir = %s) in read_dir(disk_path = %s)", dsk_dir ? dsk_dir : "", disk_path ? disk_path : "" ); return NULL; } } while ((dp = readdir(dirp)) != NULL){ snprintf(temp_name, sizeof temp_name, "../..%s", disk_path); snprintf(dir_dname, sizeof dir_dname, "%s/%s", dsk_dir, dp->d_name); stat(dir_dname,&stbuf); if (S_ISBLK(stbuf.st_mode)){ x = readlink(dir_dname, file_name, sizeof(file_name)); file_name[x] = '\0'; if (strcmp(file_name, temp_name) == 0) { if (SG_ERROR_NONE != sg_update_string(&svr_name, dp->d_name) ) { char *buf = NULL; ERROR_LOG_FMT("tools", "read_dir(): %s", sg_strperror(&buf, NULL)); free(buf); return NULL; } closedir(dirp); return svr_name; } } } closedir(dirp); return NULL; } static int get_alias(char *alias){ char file[MAXPATHLEN]; di_node_t root_node; di_node_t node; di_minor_t minor = DI_MINOR_NIL; char tmpnode[MAXPATHLEN + 1]; char *phys_path; char *minor_name; char *value; int instance; if ((root_node = di_init("/", DINFOCPYALL)) == DI_NODE_NIL) { return -1; } node = di_drv_first_node(alias, root_node); while (node != DI_NODE_NIL) { if ((minor = di_minor_next(node, DI_MINOR_NIL)) != DI_MINOR_NIL) { instance = di_instance(node); phys_path = di_devfs_path(node); minor_name = di_minor_name(minor); /* sg_strlcpy(tmpnode, alias, MAXPATHLEN); */ snprintf(tmpnode, sizeof(tmpnode), "%s%d", alias, instance); sg_strlcpy(file, "/devices", sizeof file); sg_strlcat(file, phys_path, sizeof file); sg_strlcat(file, ":", sizeof file); sg_strlcat(file, minor_name, sizeof file); value = read_dir(file); if (value != NULL) { add_mapping(tmpnode, value); } di_devfs_path_free(phys_path); node = di_drv_next_node(node); } else { node = di_drv_next_node(node); } } di_fini(root_node); return 0; } #define BIG_ENOUGH 512 static int build_mapping(void) { char device_name[MAXPATHLEN]; size_t x; kstat_ctl_t *kc; kstat_t *ksp; kstat_io_t kios; char driver_list[BIG_ENOUGH][MAXPATHLEN]; size_t list_entries = 0; int found; if ((kc = kstat_open()) == NULL) { return -1; } for(ksp = kc->kc_chain; ksp; ksp = ksp->ks_next) { if( !strcmp(ksp->ks_class, "disk") ) { if(ksp->ks_type != KSTAT_TYPE_IO) continue; /* We dont want metadevices appearing as num_diskio */ if(strcmp(ksp->ks_module, "md") == 0) continue; if((kstat_read(kc, ksp, &kios))==-1) continue; strncpy(device_name, ksp->ks_name, sizeof device_name); for( x = 0; x < sizeof(device_name); ++x) { if( isdigit((int)(device_name[x])) ) break; } if(x == sizeof(device_name)) --x; device_name[x] = '\0'; /* Check if we've not already looked it up */ found = 0; for( x = 0; x < list_entries; ++x ) { if( x >= lengthof(driver_list) ){ /* We've got bigger than we thought was massive */ /* If we hit this.. Make big enough bigger */ kstat_close(kc); return -1; } if( !strncmp(driver_list[x], device_name, sizeof(driver_list[x])) ) { found = 1; break; } } if(!found) { if((get_alias(device_name)) != 0) { kstat_close(kc); return -1; } strncpy(driver_list[x], device_name, sizeof(driver_list[x])); ++list_entries; } } } kstat_close(kc); return 0; } #endif #if defined(LINUX) || defined(CYGWIN) char * sg_f_read_line( FILE *f, char *linebuf, size_t buf_size, const char *string ) { assert(linebuf); if( !linebuf ) { SET_ERROR("tools", SG_ERROR_INVALID_ARGUMENT, "sg_f_read_line(linebuf = %p", linebuf); return NULL; } while( ( fgets( linebuf, buf_size, f ) ) != NULL ) { if(string && (strncmp(string, linebuf, strlen(string))==0)){ return linebuf; } } if( !feof( f ) ) { SET_ERROR_WITH_ERRNO("tools", SG_ERROR_PARSE, "sg_f_read_line(string = %s)", string ? string : ""); } return NULL; } char * sg_get_string_match(char *line, regmatch_t *match) { regoff_t len; char *match_string; assert(line); assert(match); if( !line || !match ) { SET_ERROR("tools", SG_ERROR_INVALID_ARGUMENT, "sg_get_string_match(line = %p, match = %p)", line, match); return NULL; } len = match->rm_eo - match->rm_so; match_string = strndup(line + match->rm_so, len); if( NULL == match_string ) { SET_ERROR_WITH_ERRNO("tools", SG_ERROR_MALLOC, "sg_get_string_match: couldn't strndup()"); } return match_string; } /* Cygwin (without a recent newlib) doesn't have atoll */ #ifndef HAVE_ATOLL static long long atoll(const char *s) { long long value = 0; int isneg = 0; while ( ispace(*s) ) { s++; } if (*s == '-') { isneg = 1; s++; } while (*s >= '0' && *s <= '9') { value = (10 * value) + (*s - '0'); s++; } return (isneg ? -value : value); } #endif long long sg_get_ll_match(char *line, regmatch_t *match){ char *ptr; long long num; ptr = line + match->rm_so; num = atoll(ptr); return num; } #endif #ifndef HAVE_STRLCPY /* $OpenBSD: strlcpy.c,v 1.11 2006/05/05 15:27:38 millert Exp $ */ /* * Copyright (c) 1998 Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* * Copy src to string dst of size siz. At most siz-1 characters * will be copied. Always NUL terminates (unless siz == 0). * Returns strlen(src); if retval >= siz, truncation occurred. */ size_t sg_strlcpy(char *dst, const char *src, size_t siz){ char *d = dst; const char *s = src; size_t n = siz; /* Copy as many bytes as will fit */ if (n) { while (--n) { if ((*d++ = *s++) == '\0') break; } } /* Not enough room in dst, add NUL and traverse rest of src */ if (n == 0U) { if (siz != 0U) *d = '\0'; /* NUL-terminate dst */ while (*s++) ; } return(s - src - 1); /* count does not include NUL */ } #endif #ifndef HAVE_STRLCAT /* $OpenBSD: strlcat.c,v 1.13 2005/08/08 08:05:37 espie Exp $ */ /* * Copyright (c) 1998 Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* * Appends src to string dst of size siz (unlike strncat, siz is the * full size of dst, not space left). At most siz-1 characters * will be copied. Always NUL terminates (unless siz <= strlen(dst)). * Returns strlen(src) + MIN(siz, strlen(initial dst)). * If retval >= siz, truncation occurred. */ size_t sg_strlcat(char *dst, const char *src, size_t siz){ char *d = dst; const char *s = src; size_t n = siz; size_t dlen; /* Find the end of dst and adjust bytes left but don't go past end */ while (n-- && *d != '\0') d++; dlen = d - dst; n = siz - dlen; if (n == 0U) return(dlen + strlen(s)); while (*s != '\0') { if (n != 1U) { *d++ = *s; n--; } s++; } *d = '\0'; return(dlen + (s - src)); /* count does not include NUL */ } #endif #if !(defined(HAVE_STRNLEN) || (defined(HAVE_XOPEN_SOURCE) && (HAVE_XOPEN_SOURCE>=700))) size_t sg_strnlen(char const *s, size_t maxlen) { size_t n = 0; if(!maxlen) return maxlen; while(*s != '\0') { if(maxlen == n) break; ++s; ++n; } return n; } #endif sg_error sg_update_string(char **dest, const char *src) { char *new; if (src == NULL) { /* We're being told to set it to NULL. */ free(*dest); *dest = NULL; return SG_ERROR_NONE; } new = sg_realloc(*dest, strlen(src) + 1); if (new == NULL) { RETURN_FROM_PREVIOUS_ERROR( "tools", sg_get_error() ); } sg_strlcpy(new, src, strlen(src) + 1); *dest = new; return SG_ERROR_NONE; } sg_error sg_lupdate_string(char **dest, const char *src, size_t maxlen) { char *new; size_t newlen; if (src == NULL) { /* We're being told to set it to NULL. */ free(*dest); *dest = NULL; return SG_ERROR_NONE; } newlen = sg_strnlen(src, maxlen) + 1; /* room for trailing 0 */ new = sg_realloc(*dest, newlen); if (new == NULL) { RETURN_FROM_PREVIOUS_ERROR( "tools", sg_get_error() ); } sg_strlcpy(new, src, newlen); *dest = new; return SG_ERROR_NONE; } sg_error sg_update_mem(void **dest, const void *src, size_t len) { char *new; if (src == NULL) { /* We're being told to set it to NULL. */ free(*dest); *dest = NULL; return SG_ERROR_NONE; } new = sg_realloc(*dest, len); if (new == NULL) { RETURN_FROM_PREVIOUS_ERROR( "tools", sg_get_error() ); } memcpy(new, src, len); *dest = new; return SG_ERROR_NONE; } /* join two strings together */ sg_error sg_concat_string(char **dest, const char *src) { char *new; size_t len = 0; if( NULL == dest ) { RETURN_WITH_SET_ERROR("tools", SG_ERROR_INVALID_ARGUMENT, "dest"); } if(*dest) len += strlen(*dest); if(src) len += strlen(src); ++len; new = sg_realloc(*dest, len); if (new == NULL) { RETURN_FROM_PREVIOUS_ERROR( "tools", sg_get_error() ); } *dest = new; sg_strlcat(*dest, src, len); return SG_ERROR_NONE; } sg_error sg_init(int ignore_init_errors) { sg_error rc = sg_comp_init(ignore_init_errors); #if defined(SOLARIS) && defined(HAVE_LIBDEVINFO_H) /* On solaris 7, this will fail if you are not root. But, everything * will still work, just no disk mappings. So we will ignore the exit * status of this, and carry on merrily. */ build_mapping(); #endif return rc; #if 0 #if (defined(FREEBSD) && !defined(FREEBSD5)) || defined(DFBSD) if (sg_get_kvm() == NULL) { return -1; } if (sg_get_kvm2() == NULL) { return -1; } #endif return 0; #endif } sg_error sg_shutdown() { return sg_comp_destroy(); } sg_error sg_snapshot() { #ifdef WIN32 return sg_win32_snapshot(); #else return SG_ERROR_NONE; #endif } sg_error sg_drop_privileges() { #ifndef WIN32 #ifdef HAVE_SETEGID if (setegid(getgid()) != 0) { #elif defined(HAVE_SETRESGID) if (setresgid(getgid(), getgid(), getgid()) != 0) { #else { #endif RETURN_WITH_SET_ERROR_WITH_ERRNO("tools", SG_ERROR_SETEGID, NULL); } #ifdef HAVE_SETEUID if (seteuid(getuid()) != 0) { #elif defined(HAVE_SETRESUID) if (setresuid(getuid(), getuid(), getuid()) != 0) { #else { #endif RETURN_WITH_SET_ERROR_WITH_ERRNO("tools", SG_ERROR_SETEUID, NULL); } #endif /* WIN32 */ return SG_ERROR_NONE; } void * sg_realloc(void *ptr, size_t size) { if( 0U == size ) { free(ptr); return NULL; } else { void *tmp = realloc(ptr, size); if(tmp == NULL) { SET_ERROR_WITH_ERRNO("tools", SG_ERROR_MALLOC, "sg_realloc: couldn't realloc(to %lu bytes)", (unsigned long)size); } return tmp; } } #if !defined(HAVE_FLOCK) && defined(HAVE_FCNTL) && defined(HAVE_DECL_F_SETLK) int flock(int fd, int op) { int try_lock = (0 != (op & LOCK_NB)); struct flock fl; op &= ~LOCK_NB; switch(op) { case LOCK_SH: fl.l_type = F_RDLCK; break; case LOCK_EX: fl.l_type = F_WRLCK; break; case LOCK_UN: fl.l_type = F_UNLCK; break; default: errno = EINVAL; return -1; } fl.l_start = 0; fl.l_len = 0; fl.l_whence = SEEK_SET; return fcntl( fd, try_lock ? F_SETLK : F_SETLKW, &fl ); } #endif #if (defined(HAVE_GETMNTENT) || defined(HAVE_GETMNTENT_R) ) # if !defined(HAVE_DECL_SETMNTENT) || !defined(HAVE_DECL_ENDMNTENT) FILE * setmntent(const char *fn, const char *type) { FILE *f; if( ( f = fopen(fn, type) ) == NULL ) { SET_ERROR_WITH_ERRNO("tools", SG_ERROR_OPEN, "setmntent: fopen(%s, %s)", fn, type); return NULL; } if( flock( fileno( f ), LOCK_SH ) != 0 ) { SET_ERROR_WITH_ERRNO("tools", SG_ERROR_OPEN, "setmntent: flock(%s)", fn); fclose(f); return NULL; } return f; } int endmntent(FILE *f) { return fclose(f); } # endif #endif #ifdef WITH_LIBLOG4CPLUS # ifndef HAVE_STRLCAT # define strlcat sg_strlcat # endif # ifndef HAVE_STRLCPY # define strlcpy sg_strlcpy # endif static int check_path(char *path, size_t path_size, const char *properties_pfx) { if(properties_pfx) { strlcat(path, "/", path_size); strlcat(path, properties_pfx, path_size); strlcat(path, ".properties", path_size); } return !access( path, R_OK ); } void sg_log_init(const char *properties_pfx, const char *env_name, const char *argv0) { if(env_name) { char *p; if((p = getenv(env_name)) && check_path(p, 0, NULL)) { if( !log4cplus_file_configure(p) ) return; } if(p) { char env_dir[PATH_MAX]; strlcpy(env_dir, p, PATH_MAX); strlcat(env_dir, "DIR", PATH_MAX); if((p = getenv(env_dir))) { strlcpy(env_dir, p, PATH_MAX); if(check_path(env_dir, PATH_MAX, properties_pfx) && !log4cplus_file_configure(env_dir)) return; } } } if(argv0) { char proppath[PATH_MAX]; char *p = proppath + sg_strlcpy( proppath, argv0, PATH_MAX ); strncpy( p, ".properties", PATH_MAX - ( p - proppath ) ); if(check_path(proppath, 0, NULL) && !log4cplus_file_configure(proppath)) return; p = dirname(proppath); if(p != proppath) strlcpy(proppath, p, PATH_MAX); p = proppath + strlen(proppath); if('/' == *p) *(p--) = '\0'; p -= strlen("/.libs"); if((p > proppath) && (0 == strncmp(p, "/.libs", strlen("/.libs")))) *p = '\0'; if(check_path(proppath, PATH_MAX, properties_pfx) && !log4cplus_file_configure(proppath)) return; getcwd( proppath, sizeof(proppath) ); if(check_path(proppath, PATH_MAX, properties_pfx) && !log4cplus_file_configure(proppath)) return; } log4cplus_basic_configure(); } #endif libstatgrab-0.90/src/libstatgrab/globals.h000644 001750 001750 00000034636 12200025312 020574 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #ifndef STATGRAB_GLOBALS_H #define STATGRAB_GLOBALS_H typedef sg_error (*comp_global_init_function)(unsigned id); typedef void (*comp_global_destroy_function)(void); typedef void (*comp_global_cleanup_function)(void *); struct sg_comp_status { sg_error init_error; }; #if defined(ENABLE_THREADS) && defined(HAVE_PTHREAD) #define DECLARE_REQUIRED_COMP_LOCKS(comp,...) static const char * sg_##comp##_lock_names[] = { __VA_ARGS__ }; #define REQUIRED_COMP_LOCKS(comp) sg_##comp##_lock_names, #else #define DECLARE_REQUIRED_COMP_LOCKS(comp,...) #define REQUIRED_COMP_LOCKS(comp) #endif struct sg_comp_init { comp_global_init_function init_fn; comp_global_destroy_function destroy_fn; comp_global_cleanup_function cleanup_fn; size_t static_buf_size; #if defined(ENABLE_THREADS) && defined(HAVE_PTHREAD) const char **required_locks; #endif struct sg_comp_status *status; }; void *sg_comp_get_tls(unsigned id); #define DEFAULT_INIT_COMP(comp,...) \ static sg_error sg_##comp##_init_comp(unsigned);\ static void sg_##comp##_destroy_comp(void); \ static void sg_##comp##_cleanup_comp(void *); \ \ static struct sg_comp_status sg_##comp##_status;\ DECLARE_REQUIRED_COMP_LOCKS(comp, __VA_ARGS__) \ \ __sg_private \ const struct sg_comp_init sg_##comp##_init = { \ sg_##comp##_init_comp, \ sg_##comp##_destroy_comp, \ sg_##comp##_cleanup_comp, \ sizeof(struct sg_##comp##_glob), \ REQUIRED_COMP_LOCKS(comp) \ &sg_##comp##_status \ }; \ static unsigned int sg_##comp##_glob_id #define GLOBAL_GET_TLS(comp) (struct sg_##comp##_glob *)(sg_comp_get_tls(sg_##comp##_glob_id)) #define GLOBAL_SET_ID(comp,id) sg_##comp##_glob_id = (id) #define EASY_COMP_INIT_FN(comp) \ static sg_error sg_##comp##_init_comp(unsigned id){ \ GLOBAL_SET_ID(comp,id); \ return SG_ERROR_NONE; \ } #define EASY_COMP_DESTROY_FN(comp) \ static void sg_##comp##_destroy_comp(void){} #define EASY_COMP_CLEANUP_FN(comp,nvect) \ static void sg_##comp##_cleanup_comp(void *p){ \ struct sg_##comp##_glob *comp##_glob = p; \ unsigned i; \ TRACE_LOG_FMT(#comp, "sg_" #comp "_cleanup_comp(%p)", p); \ assert(comp##_glob); \ for( i = 0; i < nvect; ++i ) \ sg_vector_free(comp##_glob->comp##_vectors[i]); \ memset(comp##_glob->comp##_vectors, 0, sizeof(comp##_glob->comp##_vectors) ); \ } #define EASY_COMP_SETUP(comp,nvect,...) \ struct sg_##comp##_glob { \ sg_vector *comp##_vectors[nvect]; \ }; \ \ static unsigned int sg_##comp##_glob_id; \ \ EASY_COMP_INIT_FN(comp) \ EASY_COMP_DESTROY_FN(comp) \ EASY_COMP_CLEANUP_FN(comp,nvect) \ \ static struct sg_comp_status sg_##comp##_status;\ DECLARE_REQUIRED_COMP_LOCKS(comp, __VA_ARGS__) \ \ __sg_private \ const struct sg_comp_init sg_##comp##_init = { \ sg_##comp##_init_comp, \ sg_##comp##_destroy_comp, \ sg_##comp##_cleanup_comp, \ sizeof(struct sg_##comp##_glob), \ REQUIRED_COMP_LOCKS(comp) \ &sg_##comp##_status \ } #define EXTENDED_COMP_SETUP(comp,nvect,...) \ static sg_error sg_##comp##_init_comp(unsigned);\ static void sg_##comp##_destroy_comp(void); \ static void sg_##comp##_cleanup_comp(void *); \ \ struct sg_##comp##_glob { \ sg_vector *comp##_vectors[nvect]; \ }; \ \ static unsigned int sg_##comp##_glob_id; \ DECLARE_REQUIRED_COMP_LOCKS(comp, __VA_ARGS__) \ \ static struct sg_comp_status sg_##comp##_status;\ __sg_private \ const struct sg_comp_init sg_##comp##_init = { \ sg_##comp##_init_comp, \ sg_##comp##_destroy_comp, \ sg_##comp##_cleanup_comp, \ sizeof(struct sg_##comp##_glob), \ REQUIRED_COMP_LOCKS(comp) \ &sg_##comp##_status \ } #define EASY_COMP_ACCESS(fn,comp,name,idx) \ sg_##name##_stats *fn(size_t *entries) { \ \ struct sg_##comp##_glob *comp##_glob = GLOBAL_GET_TLS(comp); \ sg_error rc; \ TRACE_LOG(#comp, "entering " #fn); \ if( !comp##_glob ) { \ /* assuming error comp can't neither */ \ ERROR_LOG(#comp, #fn " failed - cannot get glob"); \ if(entries) \ *entries = 0; \ return NULL; \ } \ \ if(!comp##_glob->comp##_vectors[idx]) \ comp##_glob->comp##_vectors[idx] = sg_vector_create(1, 1, 1, & VECTOR_INIT_INFO(sg_##name##_stats)); \ \ if(comp##_glob->comp##_vectors[idx]){ \ sg_##name##_stats *name##_stats = (sg_##name##_stats *)VECTOR_DATA(comp##_glob->comp##_vectors[idx]); \ TRACE_LOG_FMT(#comp, "calling " #fn "_int(%p)", name##_stats); \ rc = fn##_int(name##_stats); \ if(SG_ERROR_NONE == rc){ \ TRACE_LOG(#comp, #fn " succeded"); \ sg_clear_error(); \ if(entries) \ *entries = VECTOR_ITEM_COUNT(comp##_glob->comp##_vectors[idx]); \ return name##_stats; \ } \ } \ else { \ rc = sg_get_error(); \ } \ \ WARN_LOG_FMT(#comp, #fn " failed with %s", sg_str_error(rc)); \ \ if(entries) \ *entries = 0; \ \ return NULL; \ } \ \ sg_##name##_stats *fn##_r(size_t *entries) { \ \ sg_vector *name##_stats_vector = sg_vector_create(1, 1, 1, & VECTOR_INIT_INFO(sg_##name##_stats)); \ sg_error rc; \ TRACE_LOG(#comp, "entering " #fn "_r"); \ if(name##_stats_vector) { \ sg_##name##_stats *name##_stats = (sg_##name##_stats *)VECTOR_DATA(name##_stats_vector); \ TRACE_LOG_FMT(#comp, "calling " #fn "_int(%p)", name##_stats); \ rc = fn##_int(name##_stats); \ if(SG_ERROR_NONE == rc){ \ TRACE_LOG(#comp, #fn "_r succeded"); \ sg_clear_error(); \ if(entries) \ *entries = VECTOR_ITEM_COUNT(name##_stats_vector); \ return name##_stats; \ } \ sg_vector_free(name##_stats_vector); \ } \ else { \ rc = sg_get_error(); \ } \ \ WARN_LOG_FMT(#comp, #fn "_r failed with %s", sg_str_error(rc)); \ \ if(entries) \ *entries = 0; \ \ return NULL; \ } #define MULTI_COMP_ACCESS(fn,comp,name,idx) \ sg_##name##_stats *fn(size_t *entries) { \ \ struct sg_##comp##_glob *comp##_glob = GLOBAL_GET_TLS(comp); \ sg_error rc; \ TRACE_LOG(#comp, "entering " #fn); \ if( !comp##_glob ) { \ /* assuming error comp can't neither */ \ ERROR_LOG(#comp, #fn " failed - cannot get glob"); \ if(entries) \ *entries = 0; \ return NULL; \ } \ \ if(!comp##_glob->comp##_vectors[idx]) \ comp##_glob->comp##_vectors[idx] = VECTOR_CREATE(sg_##name##_stats, 16); \ else \ VECTOR_CLEAR(comp##_glob->comp##_vectors[idx]); \ \ if(comp##_glob->comp##_vectors[idx]){ \ TRACE_LOG_FMT(#comp, "calling " #fn "_int(%p)", &comp##_glob->comp##_vectors[idx]); \ rc = fn##_int(&comp##_glob->comp##_vectors[idx]); \ if(SG_ERROR_NONE == rc) { \ sg_##name##_stats *name##_stats = (sg_##name##_stats *)VECTOR_DATA(comp##_glob->comp##_vectors[idx]); \ TRACE_LOG(#comp, #fn " succeded"); \ sg_clear_error(); \ if(entries) \ *entries = VECTOR_ITEM_COUNT(comp##_glob->comp##_vectors[idx]); \ return name##_stats; \ } \ } \ else { \ rc = sg_get_error(); \ } \ \ WARN_LOG_FMT(#comp, #fn " failed with %s", sg_str_error(rc)); \ \ if(entries) \ *entries = 0; \ \ return NULL; \ } \ \ sg_##name##_stats *fn##_r(size_t *entries) { \ sg_vector *name##_vector = VECTOR_CREATE(sg_##name##_stats, 16); \ sg_error rc; \ TRACE_LOG(#comp, "entering " #fn); \ if(name##_vector) { \ TRACE_LOG_FMT(#comp, "calling " #fn "_int(%p)", &name##_vector); \ rc = fn##_int(&name##_vector); \ if( SG_ERROR_NONE == rc ) { \ sg_##name##_stats *name##_stats = (sg_##name##_stats *)VECTOR_DATA(name##_vector); \ TRACE_LOG(#comp, #fn " succeded"); \ sg_clear_error(); \ if(entries) \ *entries = VECTOR_ITEM_COUNT(name##_vector); \ return name##_stats; \ } \ sg_vector_free(name##_vector); \ } \ else { \ rc = sg_get_error(); \ } \ \ WARN_LOG_FMT(#comp, #fn "_r failed with %s", sg_str_error(rc)); \ \ if(entries) \ *entries = 0; \ \ return NULL; \ } #define EASY_COMP_DIFF(fn,getfn,comp,name,diffidx,nowidx) \ sg_##name##_stats *fn(size_t *entries) { \ \ struct sg_##comp##_glob *comp##_glob = GLOBAL_GET_TLS(comp); \ TRACE_LOG(#comp, "entering " #fn); \ if( !comp##_glob ) { \ /* assuming error comp can't neither */ \ ERROR_LOG(#comp, #fn " failed - cannot get glob"); \ if(entries) \ *entries = 0; \ return NULL; \ } \ \ if(!comp##_glob->comp##_vectors[nowidx]) { \ TRACE_LOG_FMT(#comp, #fn " has nothing to compare with - calling %s", #getfn); \ return getfn(entries); \ } \ \ if(!comp##_glob->comp##_vectors[diffidx]) \ comp##_glob->comp##_vectors[diffidx] = sg_vector_create(1, 1, 1, & VECTOR_INIT_INFO(sg_##name##_stats)); \ \ if(comp##_glob->comp##_vectors[diffidx]) { \ sg_##name##_stats name##_last = *((sg_##name##_stats *)VECTOR_DATA(comp##_glob->comp##_vectors[nowidx])); \ sg_##name##_stats *name##_diff = (sg_##name##_stats *)VECTOR_DATA(comp##_glob->comp##_vectors[diffidx]); \ sg_##name##_stats *name##_now = getfn(NULL); \ \ TRACE_LOG_FMT(#comp, "calling " #fn "_diff(%p, %p, %p)", name##_diff, name##_now, &name##_last); \ if( (NULL != name##_now) && ( SG_ERROR_NONE == fn##_int(name##_diff, name##_now, &name##_last) ) ) { \ TRACE_LOG(#comp, #fn " succeded"); \ sg_clear_error(); \ if(entries) \ *entries = VECTOR_ITEM_COUNT(comp##_glob->comp##_vectors[diffidx]); \ return name##_diff; \ } \ } \ \ WARN_LOG_FMT(#comp, #fn " failed with %s", sg_str_error(sg_get_error())); \ \ if(entries) \ *entries = 0; \ \ return NULL; \ } \ \ sg_##name##_stats *fn##_between(const sg_##name##_stats *name##_now, const sg_##name##_stats *name##_last, size_t *entries) { \ \ sg_vector *name##_diff_vector; \ \ TRACE_LOG(#comp, "entering " #fn "_between"); \ name##_diff_vector = sg_vector_create(1, 1, 1, & VECTOR_INIT_INFO(sg_##name##_stats)); \ if(name##_diff_vector){ \ sg_error rc; \ sg_##name##_stats *name##_diff = (sg_##name##_stats *)VECTOR_DATA(name##_diff_vector); \ TRACE_LOG_FMT(#comp, "calling " #fn "_diff(%p, %p, %p)", name##_diff, name##_now, &name##_last); \ rc = fn##_int(name##_diff, name##_now, name##_last); \ if( SG_ERROR_NONE == rc ) { \ TRACE_LOG(#comp, #fn "_between succeded"); \ sg_clear_error(); \ if(entries) \ *entries = VECTOR_ITEM_COUNT(name##_diff_vector); \ return name##_diff; \ } \ sg_vector_free(name##_diff_vector); \ } \ \ WARN_LOG_FMT(#comp, #fn "_between failed with %s", sg_str_error(sg_get_error())); \ \ if(entries) \ *entries = 0; \ \ return NULL; \ } #define MULTI_COMP_DIFF(fn,getfn,comp,name,diffidx,nowidx) \ sg_##name##_stats *fn(size_t *entries){ \ \ struct sg_##comp##_glob *comp##_glob = GLOBAL_GET_TLS(comp); \ TRACE_LOG(#comp, "entering " #fn); \ if( !comp##_glob ) { \ /* assuming error comp can't neither */ \ ERROR_LOG(#comp, #fn " failed - cannot get glob"); \ if(entries) \ *entries = 0; \ return NULL; \ } \ \ if(!comp##_glob->comp##_vectors[nowidx]){ \ TRACE_LOG_FMT(#comp, #fn " has nothing to compare with - calling %s", #getfn); \ return getfn(entries); \ } \ \ if(!comp##_glob->comp##_vectors[diffidx]) \ comp##_glob->comp##_vectors[diffidx] = VECTOR_CREATE(sg_##name##_stats, comp##_glob->comp##_vectors[nowidx]->used_count); \ \ if( comp##_glob->comp##_vectors[diffidx] ) { \ sg_error rc; \ sg_vector *last = sg_vector_clone(comp##_glob->comp##_vectors[nowidx]); \ \ if(!last) \ goto err_out; \ \ TRACE_LOG(#comp, "calling " #getfn "(NULL)"); \ getfn(NULL); \ \ rc = sg_vector_compute_diff(&comp##_glob->comp##_vectors[diffidx], comp##_glob->comp##_vectors[nowidx], last); \ sg_vector_free( last ); \ \ if( SG_ERROR_NONE == rc ) { \ TRACE_LOG(#comp, #fn " succeded"); \ sg_clear_error(); \ if(entries) \ *entries = VECTOR_ITEM_COUNT(comp##_glob->comp##_vectors[diffidx]); \ return VECTOR_DATA(comp##_glob->comp##_vectors[diffidx]); \ } \ } \ \ err_out: \ if(entries) \ *entries = 0; \ \ WARN_LOG_FMT(#comp, #fn " failed with %s", sg_str_error(sg_get_error())); \ \ return NULL; \ } \ \ sg_##name##_stats * \ fn##_between(const sg_##name##_stats *cur, \ const sg_##name##_stats *last, \ size_t *entries) { \ \ sg_vector *name##_diff_vector; \ sg_error rc; \ \ TRACE_LOG(#comp, "entering " #fn "_between"); \ name##_diff_vector = VECTOR_CREATE(sg_##name##_stats, 1); \ if(name##_diff_vector){ \ rc = sg_vector_compute_diff(&name##_diff_vector, VECTOR_ADDRESS_CONST(cur), VECTOR_ADDRESS_CONST(last)); \ \ if( SG_ERROR_NONE == rc ) { \ TRACE_LOG(#comp, #fn "_between succeded"); \ sg_clear_error(); \ if(entries) \ *entries = VECTOR_ITEM_COUNT(name##_diff_vector); \ return VECTOR_DATA(name##_diff_vector); \ } \ \ sg_vector_free(name##_diff_vector); \ } \ else { \ rc = sg_get_error(); \ } \ \ WARN_LOG_FMT(#comp, #fn "_between failed with %s", sg_str_error(rc)); \ \ if(entries) \ *entries = 0; \ \ return NULL; \ } __sg_private sg_error sg_comp_init(int ignore_init_errors); __sg_private sg_error sg_comp_destroy(void); __sg_private sg_error sg_global_lock(void); __sg_private sg_error sg_global_unlock(void); #endif /* STATGRAB_GLOBALS_H */ libstatgrab-0.90/src/libstatgrab/process_stats.c000644 001750 001750 00000137640 12200025312 022037 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #define __NEED_SG_GET_SYS_PAGE_SIZE #include "tools.h" #ifdef HAVE_PROCFS /* XXX move it to a ./configure --with-proc-location[=/proc] setting */ #define PROC_LOCATION "/proc" #define MAX_FILE_LENGTH PATH_MAX #endif #if defined(AIX) # ifndef HAVE_DECL_GETPROCS64 extern int getprocs64(struct procentry64 *, int, struct fdsinfo64 *, int, pid_t *, int); # endif # ifndef HAVE_DECL_GETARGS extern int getargs(struct procentry64 *, int, char *, int); # endif #endif static void sg_process_stats_item_init(sg_process_stats *d) { d->process_name = NULL; d->proctitle = NULL; } #if 0 static sg_error sg_process_stats_item_copy(const sg_process_stats *s, sg_process_stats *d) { if( SG_ERROR_NONE != sg_update_string(&d->process_name, s->process_name) || SG_ERROR_NONE != sg_update_string(&d->proctitle, s->proctitle) ) { RETURN_FROM_PREVIOUS_ERROR( "process", sg_get_error() ); } d->pid = s->pid; d->parent = s->parent; d->pgid = s->pgid; d->uid = s->uid; d->euid = s->euid; d->gid = s->gid; d->egid = s->egid; d->proc_size = s->proc_size; d->proc_resident = s->proc_resident; d->time_spent = s->time_spent; d->cpu_percent = s->cpu_percent; d->nice = s->nice; d->state = s->state; return SG_ERROR_NONE; } static sg_error sg_process_stats_item_compute_diff(const sg_process_stats *s, sg_process_stats *d) { /* XXX how "diff" user or nice changes etc. */ d->proc_size -= s->proc_size; d->proc_resident -= s->proc_resident; d->time_spent -= s->time_spent; d->cpu_percent -= s->cpu_percent; return SG_ERROR_NONE; } static int sg_process_stats_item_compare(const sg_process_stats *a, const sg_process_stats *b) { int rc; if( ( 0 != ( rc = a->pid - b->pid ) ) || ( 0 != ( rc = a->parent - b->parent ) ) || ( 0 != ( rc = a->pgid - b->pgid ) ) || ( 0 != ( rc = strcmp(a->device_name, b->device_name) ) ) ) return rc; return 0; } #else #define sg_process_stats_item_copy NULL #define sg_process_stats_item_compute_diff NULL #define sg_process_stats_item_compare NULL #endif static void sg_process_stats_item_destroy(sg_process_stats *d) { free(d->process_name); free(d->proctitle); } VECTOR_INIT_INFO_FULL_INIT(sg_process_stats); VECTOR_INIT_INFO_EMPTY_INIT(sg_process_count); #define SG_PROC_STAT_IDX 0 #define SG_PROC_COUNT_IDX 1 #define SG_PROC_IDX_COUNT 2 /* kvm_openfiles() cann succeed at any later point when the admin adjust * permissions of accessed files - no reason to die in init() */ EXTENDED_COMP_SETUP(process,SG_PROC_IDX_COUNT,NULL); static sg_error sg_process_init_comp(unsigned id) { ssize_t pagesize; GLOBAL_SET_ID(process,id); if((pagesize = sg_get_sys_page_size()) == -1) { RETURN_WITH_SET_ERROR_WITH_ERRNO("process", SG_ERROR_SYSCONF, "_SC_PAGESIZE"); } return SG_ERROR_NONE; } EASY_COMP_DESTROY_FN(process) EASY_COMP_CLEANUP_FN(process,SG_PROC_IDX_COUNT) #ifdef HAVE_PROCFS struct pids_in_proc_dir_t { size_t nitems; struct pids_in_proc_dir_t *next; #if defined(HAVE_OPEN_ARRAY_AT_STRUCT_END) pid_t items[]; #elif defined(HAVE_ZERO_SIZED_ARRAY) pid_t items[0]; #else pid_t items[1]; #endif }; static struct pids_in_proc_dir_t * alloc_pids_in_proc_dir(void) { struct pids_in_proc_dir_t *pipd = malloc( sys_page_size ); if( pipd != NULL ) { pipd->nitems = 0; pipd->next = NULL; } return pipd; } /** * free pids_in_proc_dir_t structure * * @param pipd - pointer to structure to be freed * @param include_children - when true, next pointer chain is followed and freed, too * * @return next pids_in_proc_dir_t item (or NULL, when no remains) */ static struct pids_in_proc_dir_t * free_pids_in_proc_dir( struct pids_in_proc_dir_t *pipd, bool include_children ) { struct pids_in_proc_dir_t *next = NULL; while( pipd != NULL ) { next = pipd->next; free(pipd); if( include_children ) pipd = next; else pipd = NULL; } return next; } #define PIPD_IS_FULL(pipd,size) (((size) - ((offsetof(struct pids_in_proc_dir_t, items)))/sizeof(pid_t)) < ((pipd)->nitems + 1)) static struct pids_in_proc_dir_t * add_pid_to_pids_in_proc_dir( pid_t pid, struct pids_in_proc_dir_t *pipd ) { assert( pipd != NULL ); assert( NULL == pipd->next ); if( PIPD_IS_FULL( pipd, sys_page_size ) ) { pipd->next = alloc_pids_in_proc_dir(); if( NULL == pipd->next ) return NULL; pipd = pipd->next; } pipd->items[pipd->nitems++] = pid; return pipd; } static struct pids_in_proc_dir_t * scan_proc_dir( const char *path_to_proc_dir ) { DIR *proc_dir; struct dirent *dir_entry, *result = NULL; size_t dir_entry_size = sizeof(*dir_entry) - sizeof(dir_entry->d_name) + PATH_MAX + 1; struct pids_in_proc_dir_t *cnt = alloc_pids_in_proc_dir(), *wrk; int rc; if( NULL == cnt ) return NULL; dir_entry = calloc(1, dir_entry_size); if( NULL == dir_entry) { free_pids_in_proc_dir(cnt, true); return NULL; } if( ( proc_dir = opendir(path_to_proc_dir) ) == NULL ) { SET_ERROR_WITH_ERRNO("process", SG_ERROR_OPENDIR, path_to_proc_dir); free_pids_in_proc_dir(cnt, true); free(dir_entry); return NULL; } wrk = cnt; while( ( rc = readdir_r( proc_dir, dir_entry, &result ) ) == 0 ) { pid_t pid; if( NULL == result ) break; if( 0 != sscanf(dir_entry->d_name, FMT_PID_T, &pid) ) { wrk = add_pid_to_pids_in_proc_dir( pid, wrk ); if( NULL == wrk ) { free_pids_in_proc_dir(cnt, true); cnt = NULL; break; /* bail out */ } } } if( rc != 0 ) { SET_ERROR_WITH_ERRNO_CODE( "process", SG_ERROR_READDIR, rc, path_to_proc_dir ); } free(dir_entry); closedir(proc_dir); return cnt; } #endif #if defined(KERN_PROC_ARGS) || defined(KERN_PROC_ARGV) || defined(KERN_PROCARGS2) || defined(AIX) || defined(LINUX) static char * adjust_procname_cmndline(char *proctitle, size_t len) { char *p, *pt; /* XXX OpenBSD prepends char *[] adressing the several embedded argv items */ #if defined(DARWIN) pt = p = proctitle + sizeof(int);; #else if(len > sizeof(p)) memcpy(&p, proctitle, sizeof(p)); /* p = ((char **)(proctitle))[0], but without violating alignment rules */ else p = proctitle - len - 1; if( len && ((size_t)(p - proctitle) <= len) ) { pt = p; len -= p - proctitle; } else { pt = p = proctitle; } #endif while( ( len && ( p < (pt + len) ) ) || !len ) { if( *(p+1) == '\0' ) break; if( *p == '\0' ) { *p++ = ' '; } else { /* avoid overread when whitespace at end */ p += strlen(p); } } if( len ) { pt[len] = '\0'; } else { *p = '\0'; } return pt; } #endif static sg_error sg_get_process_stats_int(sg_vector **proc_stats_vector_ptr) { size_t proc_items = 0; sg_process_stats *proc_stats_ptr; time_t now = time(NULL); #if defined(LINUX) struct pids_in_proc_dir_t *pids_in_proc_dir; size_t pid_item = 0; char filename[MAX_FILE_LENGTH]; FILE *f; char s; char read_buf[4096]; char *read_ptr; /* XXX or we detect max command line length in ./configure */ unsigned long stime, utime; unsigned long long starttime; int fd, rc; size_t len; time_t uptime; long tickspersec; #elif defined(SOLARIS) struct pids_in_proc_dir_t *pids_in_proc_dir; size_t pid_item = 0; char filename[MAX_FILE_LENGTH]; FILE *f; psinfo_t process_info; prusage_t process_usage; #elif defined(HPUX) #define PROCESS_BATCH 50 struct pst_status *pstat_procinfo = NULL; long procidx = 0; int num, i; #elif defined(AIX) struct procentry64 *procs = NULL; ssize_t fetched = 0, ncpus; pid_t index = 0; time_t utime, stime; struct timeval now_tval; double now_time; char *cmndlinebuf = NULL, comm[2*MAXCOMLEN+1]; /* struct procentry64 curproc_for_getargs; */ #define PROCS_TO_FETCH 250 #elif defined(HAVE_STRUCT_KINFO_PROC2) && defined(KERN_PROC2) int mib[6], rc; size_t size, argbufsize = ARG_MAX, i, nprocs; struct kinfo_proc2 *kp_stats = NULL, *tmp; char *proctitle; #elif defined(HAVE_STRUCT_KINFO_PROC) && defined(KERN_PROC) int mib[6], rc; size_t size, nprocs, i; struct kinfo_proc *kp_stats = NULL, *tmp; char *proctitle; #endif #if defined(SOLARIS) if( NULL == ( pids_in_proc_dir = scan_proc_dir( PROC_LOCATION ) ) ) { RETURN_FROM_PREVIOUS_ERROR( "process", sg_get_error() ); } #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP VECTOR_UPDATE(proc_stats_vector_ptr, proc_items + pids_in_proc_dir->nitems, proc_stats_ptr, sg_process_stats); while( pids_in_proc_dir != NULL ) { if( pids_in_proc_dir->nitems <= pid_item ) { pids_in_proc_dir = free_pids_in_proc_dir( pids_in_proc_dir, false ); if( pids_in_proc_dir != NULL ) { VECTOR_UPDATE(proc_stats_vector_ptr, proc_items + pids_in_proc_dir->nitems, proc_stats_ptr, sg_process_stats); } pid_item = 0; continue; } snprintf(filename, MAX_FILE_LENGTH, PROC_LOCATION "/" FMT_PID_T "/psinfo", pids_in_proc_dir->items[pid_item]); if( ( f = fopen(filename, "r") ) == NULL ) { /* Open failed.. Process since vanished, or the path was too long. * Ah well, move onwards to the next one */ ++pid_item; continue; } fread(&process_info, sizeof(psinfo_t), 1, f); fclose(f); proc_stats_ptr[proc_items].pid = process_info.pr_pid; proc_stats_ptr[proc_items].parent = process_info.pr_ppid; proc_stats_ptr[proc_items].pgid = process_info.pr_pgid; proc_stats_ptr[proc_items].uid = process_info.pr_uid; proc_stats_ptr[proc_items].euid = process_info.pr_euid; proc_stats_ptr[proc_items].gid = process_info.pr_gid; proc_stats_ptr[proc_items].egid = process_info.pr_egid; proc_stats_ptr[proc_items].proc_size = (process_info.pr_size) * 1024; proc_stats_ptr[proc_items].proc_resident = (process_info.pr_rssize) * 1024; proc_stats_ptr[proc_items].start_time = process_info.pr_start.tv_sec; proc_stats_ptr[proc_items].time_spent = process_info.pr_time.tv_sec; proc_stats_ptr[proc_items].cpu_percent = (process_info.pr_pctcpu * 100.0) / 0x8000; proc_stats_ptr[proc_items].nice = (int)process_info.pr_lwp.pr_nice - 20; if( ( SG_ERROR_NONE != sg_update_string(&proc_stats_ptr[proc_items].process_name, process_info.pr_fname) ) || ( SG_ERROR_NONE != sg_update_string(&proc_stats_ptr[proc_items].proctitle, process_info.pr_psargs) ) ) { VECTOR_UPDATE_ERROR_CLEANUP RETURN_FROM_PREVIOUS_ERROR( "process", sg_get_error() ); } switch (process_info.pr_lwp.pr_state) { case 1: proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_SLEEPING; break; case 2: case 5: proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_RUNNING; break; case 3: proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_ZOMBIE; break; case 4: proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_STOPPED; break; } snprintf(filename, MAX_FILE_LENGTH, PROC_LOCATION "/" FMT_PID_T "/usage", pids_in_proc_dir->items[pid_item]); if( ( f = fopen(filename, "r") ) != NULL ) { fread(&process_usage, sizeof(process_usage), 1, f); fclose(f); proc_stats_ptr[proc_items].context_switches = process_usage.pr_vctx + process_usage.pr_ictx; proc_stats_ptr[proc_items].voluntary_context_switches = process_usage.pr_vctx; proc_stats_ptr[proc_items].involuntary_context_switches = process_usage.pr_ictx; } proc_stats_ptr[proc_items].systime = now; ++pid_item; ++proc_items; } #elif defined(LINUX) if( ( f = fopen(PROC_LOCATION "/uptime", "r") ) == NULL ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("process", SG_ERROR_OPEN, PROC_LOCATION "/uptime"); } if( ( fscanf(f, FMT_TIME_T " %*d", &uptime) ) != 1 ) { fclose(f); RETURN_WITH_SET_ERROR("process", SG_ERROR_PARSE, NULL); } fclose(f); if( NULL == ( pids_in_proc_dir = scan_proc_dir( PROC_LOCATION ) ) ) { RETURN_FROM_PREVIOUS_ERROR( "process", sg_get_error() ); } tickspersec = sysconf (_SC_CLK_TCK); #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP fclose(f); VECTOR_UPDATE(proc_stats_vector_ptr, proc_items + pids_in_proc_dir->nitems, proc_stats_ptr, sg_process_stats); while( pids_in_proc_dir != NULL ) { if( pids_in_proc_dir->nitems <= pid_item ) { pids_in_proc_dir = free_pids_in_proc_dir( pids_in_proc_dir, false ); if( pids_in_proc_dir != NULL ) { VECTOR_UPDATE(proc_stats_vector_ptr, proc_items + pids_in_proc_dir->nitems, proc_stats_ptr, sg_process_stats); } pid_item = 0; continue; } snprintf(filename, MAX_FILE_LENGTH, PROC_LOCATION "/" FMT_PID_T "/stat", pids_in_proc_dir->items[pid_item]); if( ( f = fopen(filename, "r") ) == NULL ) { /* Open failed.. Process since vanished, or the path was too long. * Ah well, move onwards to the next one */ ++pid_item; continue; } VECTOR_UPDATE(proc_stats_vector_ptr, proc_items + 1, proc_stats_ptr, sg_process_stats); fscanf(f, FMT_PID_T "%4095s %c " FMT_PID_T " " FMT_PID_T " %*d %*d %*d %*u %*u %*u %*u %*u %lu %lu %*d %*d %*d %d %*d %*d %llu %llu %llu %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*u %*d %*d\n", &proc_stats_ptr[proc_items].pid, read_buf, &s, &proc_stats_ptr[proc_items].parent, &proc_stats_ptr[proc_items].pgid, &utime, &stime, &proc_stats_ptr[proc_items].nice, &starttime, &proc_stats_ptr[proc_items].proc_size, &proc_stats_ptr[proc_items].proc_resident); /* +3 because man page says "Resident Set Size: number of pages the process has in real memory, minus 3 for administrative purposes." */ proc_stats_ptr[proc_items].proc_resident = (proc_stats_ptr[proc_items].proc_resident + 3) * sys_page_size; switch (s) { case 'S': proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_SLEEPING; break; case 'R': proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_RUNNING; break; case 'Z': proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_ZOMBIE; break; case 'T': case 'D': proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_STOPPED; break; } /* pa_name[0] should = '(' */ read_ptr = strchr(&read_buf[1], ')'); if( read_ptr != NULL ) { *read_ptr = '\0'; } if( SG_ERROR_NONE != sg_update_string( &proc_stats_ptr[proc_items].process_name, &read_buf[1] )) { VECTOR_UPDATE_ERROR_CLEANUP RETURN_FROM_PREVIOUS_ERROR( "process", sg_get_error() ); } /* cpu */ proc_stats_ptr[proc_items].cpu_percent = (100.0 * (utime + stime)) / ((uptime * 100.0) - starttime); if (tickspersec < 0) { proc_stats_ptr[proc_items].time_spent = 0; proc_stats_ptr[proc_items].start_time = 0; } else { proc_stats_ptr[proc_items].time_spent = (utime + stime) / tickspersec; proc_stats_ptr[proc_items].start_time = (now - uptime) + (starttime / tickspersec); } fclose(f); /* uid / gid */ snprintf(filename, MAX_FILE_LENGTH, PROC_LOCATION "/" FMT_PID_T "/status", pids_in_proc_dir->items[pid_item]); if ((f=fopen(filename, "r")) == NULL) { /* Open failed.. Process since vanished, or the path was too long. * Ah well, move onwards to the next one */ ++pid_item; continue; } /* XXX is it sure that "Uid:" is always found before "Gid:"? */ if( sg_f_read_line(f, read_buf, sizeof(read_buf), "Uid:") == NULL ) { fclose(f); ++pid_item; continue; } sscanf(read_buf, "Uid:\t" FMT_UID_T "\t" FMT_UID_T "\t%*d\t%*d\n", &proc_stats_ptr[proc_items].uid, &proc_stats_ptr[proc_items].euid); if( sg_f_read_line(f, read_buf, sizeof(read_buf), "Gid:") == NULL ) { fclose(f); ++pid_item; continue; } sscanf(read_buf, "Gid:\t" FMT_GID_T "\t" FMT_GID_T "\t%*d\t%*d\n", &proc_stats_ptr[proc_items].gid, &proc_stats_ptr[proc_items].egid); if( sg_f_read_line(f, read_buf, sizeof(read_buf), "voluntary_ctxt_switches:") != NULL ) sscanf(read_buf, "voluntary_ctxt_switches:\t%llu", &proc_stats_ptr[proc_items].voluntary_context_switches); else proc_stats_ptr[proc_items].voluntary_context_switches = 0; if( sg_f_read_line(f, read_buf, sizeof(read_buf), "nonvoluntary_ctxt_switches:") != NULL ) sscanf(read_buf, "nonvoluntary_ctxt_switches:\t%llu", &proc_stats_ptr[proc_items].involuntary_context_switches); else proc_stats_ptr[proc_items].involuntary_context_switches = 0; proc_stats_ptr[proc_items].context_switches = proc_stats_ptr[proc_items].voluntary_context_switches + proc_stats_ptr[proc_items].involuntary_context_switches; fclose(f); /* proctitle */ snprintf(filename, MAX_FILE_LENGTH, PROC_LOCATION "/" FMT_PID_T "/cmdline", pids_in_proc_dir->items[pid_item]); if( ( fd = open(filename, O_RDONLY) ) == -1 ) { /* Open failed.. Process since vanished, or the path was too long. * Ah well, move onwards to the next one */ ++pid_item; continue; } len = 0; do { rc = read(fd, read_buf, sizeof(read_buf)); if (rc > 0) { read_ptr = sg_realloc( proc_stats_ptr[proc_items].proctitle, len + rc + 1 ); if( NULL == read_ptr ) { free(proc_stats_ptr[proc_items].proctitle); proc_stats_ptr[proc_items].proctitle = NULL; close(fd); RETURN_FROM_PREVIOUS_ERROR( "process", sg_get_error() ); } proc_stats_ptr[proc_items].proctitle = read_ptr; memcpy( proc_stats_ptr[proc_items].proctitle + len, read_buf, rc ); len += rc; } } while (rc > 0); close(fd); if (rc == -1) { /* Read failed; move on. */ free(proc_stats_ptr[proc_items].proctitle); proc_stats_ptr[proc_items].proctitle = NULL; ++pid_item; continue; } if( proc_stats_ptr[proc_items].proctitle ) { /* no title, no finish 0 byte */ proc_stats_ptr[proc_items].proctitle[len] = '\0'; adjust_procname_cmndline( proc_stats_ptr[proc_items].proctitle, len ); } else { if( -1 == asprintf( &proc_stats_ptr[proc_items].proctitle, "[%s]", proc_stats_ptr[proc_items].process_name ) ) { VECTOR_UPDATE_ERROR_CLEANUP; RETURN_WITH_SET_ERROR_WITH_ERRNO("process", SG_ERROR_ASPRINTF, NULL); } } proc_stats_ptr[proc_items].systime = now; ++pid_item; ++proc_items; } #elif defined(HAVE_STRUCT_KINFO_PROC2) && defined(KERN_PROC2) mib[0] = CTL_KERN; mib[1] = KERN_PROC2; #if defined(KERN_PROC_KTHREAD) mib[2] = KERN_PROC_KTHREAD; #else mib[2] = KERN_PROC_ALL; #endif mib[3] = 0; mib[4] = sizeof(*kp_stats); if( NULL == (proctitle = sg_malloc( ARG_MAX * sizeof(*proctitle) ) ) ) { RETURN_FROM_PREVIOUS_ERROR( "process", sg_get_error() ); } again: size = 0; mib[5] = 0; if( -1 == ( rc = sysctl(mib, 6, NULL, &size, NULL, 0) ) ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("process", SG_ERROR_SYSCTL, "CTL_KERN.KERN_PROC2.KERN_PROC_ALL"); } mib[5] = size / sizeof(*kp_stats); if( 0 == ( tmp = sg_realloc( kp_stats, size ) ) ) { free(kp_stats); free(proctitle); RETURN_FROM_PREVIOUS_ERROR( "process", sg_get_error() ); } kp_stats = tmp; if( -1 == (rc = sysctl(mib, 6, kp_stats, &size, NULL, (size_t)0 ) ) ) { if( errno == ENOMEM ) { goto again; } RETURN_WITH_SET_ERROR_WITH_ERRNO("process", SG_ERROR_SYSCTL, "CTL_KERN.KERN_PROC2.KERN_PROC_ALL"); } nprocs = size / sizeof(*kp_stats); #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP free(kp_stats); free(proctitle); VECTOR_UPDATE(proc_stats_vector_ptr, nprocs, proc_stats_ptr, sg_process_stats); for( i = 0; i < nprocs; ++i ) { if( SG_ERROR_NONE != sg_update_string(&proc_stats_ptr[i].process_name, kp_stats[i].p_comm ) ) { VECTOR_UPDATE_ERROR_CLEANUP RETURN_FROM_PREVIOUS_ERROR( "process", sg_get_error() ); } proc_stats_ptr[proc_items].pid = kp_stats[i].p_pid; proc_stats_ptr[proc_items].parent = kp_stats[i].p_ppid; proc_stats_ptr[proc_items].pgid = kp_stats[i].p__pgid; proc_stats_ptr[proc_items].sessid = kp_stats[i].p_sid; proc_stats_ptr[proc_items].uid = kp_stats[i].p_uid; proc_stats_ptr[proc_items].euid = kp_stats[i].p_ruid; proc_stats_ptr[proc_items].gid = kp_stats[i].p_gid; proc_stats_ptr[proc_items].egid = kp_stats[i].p_rgid; proc_stats_ptr[proc_items].voluntary_context_switches = kp_stats[i].p_uru_nvcsw; proc_stats_ptr[proc_items].involuntary_context_switches = kp_stats[i].p_uru_nivcsw; proc_stats_ptr[proc_items].context_switches = proc_stats_ptr[i].voluntary_context_switches + proc_stats_ptr[i].involuntary_context_switches; proc_stats_ptr[proc_items].proc_size = ((unsigned long long)kp_stats[i].p_vm_dsize) + kp_stats[i].p_vm_ssize; proc_stats_ptr[proc_items].proc_size *= sys_page_size; proc_stats_ptr[proc_items].proc_resident = ((unsigned long long)kp_stats[i].p_vm_rssize) * sys_page_size; proc_stats_ptr[proc_items].start_time = kp_stats[i].p_ustart_sec; proc_stats_ptr[proc_items].time_spent = ((unsigned long long)kp_stats[i].p_uutime_sec) + kp_stats[i].p_ustime_sec; proc_stats_ptr[proc_items].cpu_percent = ((double)kp_stats[i].p_cpticks / FSCALE) * 100.0; /* XXX CTL_KERN.KERN_FSCALE */ proc_stats_ptr[proc_items].nice = kp_stats[i].p_nice; switch( kp_stats[i].p_stat ) { #if defined(LSIDL) case LSIDL: #elif defined(SIDL) case SIDL: #endif #if defined(LSSLEEP) case LSSLEEP: #elif defined(SSLEEP) case SSLEEP: #endif #if defined(LSRUN) case LSRUN: /* on RUN queue - maybe soon be chosen for LSONPROC */ #elif defined(SRUN) case SRUN: /* on RUN queue - maybe soon be chosen for SONPROC */ #endif #if defined(LSSUSPENDED) case LSSUSPENDED: #endif proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_SLEEPING; break; #if defined(LSDEAD) case LSDEAD: #elif defined(SDEAD) case SDEAD: #endif #if defined(LSZOMB) case LSZOMB: #elif defined(SZOMB) case SZOMB: #endif proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_ZOMBIE; break; #if defined(LSSTOP) case LSSTOP: #elif defined(SSTOP) case SSTOP: #endif proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_STOPPED; break; #if defined(LSONPROC) case LSONPROC: #elif defined(SONPROC) case SONPROC: #endif proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_RUNNING; break; default: proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_UNKNOWN; break; } #if defined(KERN_PROC_ARGS) && defined(KERN_PROC_ARGV) if( 0 != kp_stats[i].p_pid ) { char *p; mib[0] = CTL_KERN; mib[1] = KERN_PROC_ARGS; mib[2] = kp_stats[i].p_pid; mib[3] = KERN_PROC_ARGV; *proctitle = '\0'; argv_again: size = argbufsize * sizeof(*proctitle); rc = sysctl(mib, 4, proctitle, &size, NULL, 0); if( -1 == rc ) { if( 0 == kp_stats[i].p_ppid && errno == EINVAL ) { goto print_kernel_proctitle; } else if( errno == ENOMEM ) { p = sg_realloc( proctitle, size ); if( NULL == p ) { VECTOR_UPDATE_ERROR_CLEANUP; RETURN_FROM_PREVIOUS_ERROR("process", sg_get_error() ); } argbufsize = size / sizeof(*proctitle); proctitle = p; goto argv_again; } else { long failing_pid = kp_stats[i].p_pid; INFO_LOG_FMT("process", "sysctl(CTL_KERN.KERN_PROC_ARGS.KERN_PROC_ARGV) failed for pid=%ld", failing_pid); continue; } } if( size > 1 && ( ( p = adjust_procname_cmndline( proctitle, size - 1 ) ) != NULL ) && 0 != strlen(p) ) { if( SG_ERROR_NONE != sg_update_string( &proc_stats_ptr[i].proctitle, p ) ) { VECTOR_UPDATE_ERROR_CLEANUP; RETURN_FROM_PREVIOUS_ERROR( "process", sg_get_error() ); } } else { goto print_kernel_proctitle; } } else { print_kernel_proctitle: if( -1 == asprintf( &proc_stats_ptr[i].proctitle, "[%s]", proc_stats_ptr[i].process_name ) ) { long failing_pid = kp_stats[i].p_pid; VECTOR_UPDATE_ERROR_CLEANUP; RETURN_WITH_SET_ERROR_WITH_ERRNO("process", SG_ERROR_ASPRINTF, "pid=%ld", failing_pid); } } #endif proc_stats_ptr[proc_items].systime = now; ++proc_items; } VECTOR_UPDATE(proc_stats_vector_ptr, proc_items, proc_stats_ptr, sg_process_stats); free(kp_stats); free(proctitle); #elif defined(HAVE_STRUCT_KINFO_PROC) && defined(KERN_PROC) mib[0] = CTL_KERN; mib[1] = KERN_PROC; # ifdef KERN_PROC_INC_THREAD mib[2] = KERN_PROC_PROC; mib[3] = 0; i = 4; # elif defined(HAVE_KINFO_PROC_KP_PID) || defined(HAVE_KINFO_PROC_KP_EPROC) mib[2] = KERN_PROC_ALL; i = 3; # else mib[2] = KERN_PROC_ALL; mib[3] = 0; mib[4] = sizeof(*kp_stats); mib[5] = 0; i = 6; # endif if( NULL == (proctitle = sg_malloc( ARG_MAX * sizeof(*proctitle) ) ) ) { RETURN_FROM_PREVIOUS_ERROR( "process", sg_get_error() ); } again: size = 0; mib[3] = mib[5] = 0; if( -1 == (rc = sysctl(mib, (unsigned)i, NULL, &size, NULL, 0)) ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("process", SG_ERROR_SYSCTL, "CTL_KERN.KERN_PROC.KERN_PROC_ALL"); } if( NULL == (tmp = sg_realloc(kp_stats, size)) ) { free(kp_stats); free(proctitle); RETURN_FROM_PREVIOUS_ERROR( "process", sg_get_error() ); } kp_stats = tmp; mib[5] = nprocs = size / sizeof(*kp_stats); if( -1 == (rc = sysctl(mib, (unsigned)i, kp_stats, &size, NULL, (size_t)0)) ) { if( errno == ENOMEM ) { goto again; } RETURN_WITH_SET_ERROR_WITH_ERRNO("process", SG_ERROR_SYSCTL, "CTL_KERN.KERN_PROC.KERN_PROC_ALL"); } proc_items = 0; #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP free(kp_stats); free(proctitle); VECTOR_UPDATE(proc_stats_vector_ptr, nprocs, proc_stats_ptr, sg_process_stats); for( i = 0; i < nprocs; ++i ) { const char *name; # if defined(HAVE_KINFO_PROC_KI_STAT) if( kp_stats[i].ki_stat == 0 ) # elif defined(HAVE_KINFO_PROC_KP_PID) if( kp_stats[i].kp_stat == 0 ) # elif defined(HAVE_KINFO_PROC_KP_PROC) if( kp_stats[i].kp_proc.p_stat == 0 ) # elif defined(HAVE_KINFO_PROC_P_STAT) if( kp_stats[i].p_stat == 0 ) # else if(0) # endif { /* FreeBSD 5 deliberately overallocates the array that * the sysctl returns, so we'll get a few junk * processes on the end that we have to ignore. (Search * for "overestimate by 5 procs" in * src/sys/kern/kern_proc.c for more details.) */ continue; } # if defined(HAVE_KINFO_PROC_KI_STAT) name = kp_stats[proc_items].ki_comm; # elif defined(HAVE_KINFO_PROC_KP_PID) name = kp_stats[proc_items].kp_comm; # elif defined(HAVE_KINFO_PROC_KP_THREAD) name = kp_stats[proc_items].kp_thread.td_comm; # elif defined(HAVE_KINFO_PROC_KP_PROC) name = kp_stats[proc_items].kp_proc.p_comm; # elif defined(HAVE_KINFO_PROC_P_STAT) name = kp_stats[proc_items].p_comm; # else name = ""; # endif if( SG_ERROR_NONE != sg_update_string( &proc_stats_ptr[proc_items].process_name, name ) ) { VECTOR_UPDATE_ERROR_CLEANUP RETURN_FROM_PREVIOUS_ERROR( "process", sg_get_error() ); } # if defined(HAVE_KINFO_PROC_KI_STAT) proc_stats_ptr[proc_items].pid = kp_stats[i].ki_pid; proc_stats_ptr[proc_items].parent = kp_stats[i].ki_ppid; proc_stats_ptr[proc_items].pgid = kp_stats[i].ki_pgid; proc_stats_ptr[proc_items].sessid = kp_stats[i].ki_sid; proc_stats_ptr[proc_items].uid = kp_stats[i].ki_ruid; proc_stats_ptr[proc_items].euid = kp_stats[i].ki_uid; proc_stats_ptr[proc_items].gid = kp_stats[i].ki_rgid; proc_stats_ptr[proc_items].egid = kp_stats[i].ki_svgid; # elif defined(HAVE_KINFO_PROC_KP_EPROC) proc_stats_ptr[proc_items].pid = kp_stats[i].kp_proc.p_pid; proc_stats_ptr[proc_items].parent = kp_stats[i].kp_eproc.e_ppid; proc_stats_ptr[proc_items].pgid = kp_stats[i].kp_eproc.e_pgid; proc_stats_ptr[proc_items].sessid = 0; # if defined(HAVE_KINFO_PROC_KP_EPROC_E_UCRED_CR_RUID) proc_stats_ptr[proc_items].uid = kp_stats[i].kp_eproc.e_ucred.cr_ruid; proc_stats_ptr[proc_items].euid = kp_stats[i].kp_eproc.e_ucred.cr_svuid; proc_stats_ptr[proc_items].gid = kp_stats[i].kp_eproc.e_ucred.cr_rgid; proc_stats_ptr[proc_items].egid = kp_stats[i].kp_eproc.e_ucred.cr_svgid; # else proc_stats_ptr[proc_items].uid = kp_stats[i].kp_eproc.e_pcred.p_ruid; proc_stats_ptr[proc_items].euid = kp_stats[i].kp_eproc.e_pcred.p_svuid; proc_stats_ptr[proc_items].gid = kp_stats[i].kp_eproc.e_pcred.p_rgid; proc_stats_ptr[proc_items].egid = kp_stats[i].kp_eproc.e_pcred.p_svgid; proc_stats_ptr[proc_items].cpu_percent = ((double)kp_stats[i].kp_proc.p_pctcpu / FSCALE) * 100.0; # endif # elif defined(HAVE_KINFO_PROC_KP_PID) proc_stats_ptr[proc_items].pid = kp_stats[i].kp_pid; proc_stats_ptr[proc_items].parent = kp_stats[i].kp_ppid == ((pid_t)-1) ? 0 : kp_stats[i].kp_ppid; proc_stats_ptr[proc_items].pgid = kp_stats[i].kp_pgid; proc_stats_ptr[proc_items].sessid = kp_stats[i].kp_sid; proc_stats_ptr[proc_items].uid = kp_stats[i].kp_ruid; proc_stats_ptr[proc_items].euid = kp_stats[i].kp_uid; proc_stats_ptr[proc_items].gid = kp_stats[i].kp_rgid; proc_stats_ptr[proc_items].egid = kp_stats[i].kp_svgid; #elif defined(HAVE_KINFO_PROC_P_PID) proc_stats_ptr[proc_items].pid = kp_stats[i].p_pid; proc_stats_ptr[proc_items].parent = kp_stats[i].p_ppid == ((pid_t)-1) ? 0 : kp_stats[i].p_ppid; proc_stats_ptr[proc_items].pgid = kp_stats[i].p__pgid; proc_stats_ptr[proc_items].sessid = kp_stats[i].p_sid; proc_stats_ptr[proc_items].uid = kp_stats[i].p_ruid; proc_stats_ptr[proc_items].euid = kp_stats[i].p_uid; proc_stats_ptr[proc_items].gid = kp_stats[i].p_rgid; proc_stats_ptr[proc_items].egid = kp_stats[i].p_svgid; # else proc_stats_ptr[proc_items].pid = kp_stats[i].kp_proc.p_pid; proc_stats_ptr[proc_items].parent = kp_stats[i].kp_eproc.e_ppid; proc_stats_ptr[proc_items].pgid = kp_stats[i].kp_eproc.e_pgid; proc_stats_ptr[proc_items].sessid = 0; proc_stats_ptr[proc_items].time_spent = kp_stats[i].kp_proc.p_runtime / 1000000; proc_stats_ptr[proc_items].cpu_percent = ((double)kp_stats[i].kp_proc.p_pctcpu / FSCALE) * 100.0; # endif proc_stats_ptr[proc_items].context_switches = 0; proc_stats_ptr[proc_items].voluntary_context_switches = 0; proc_stats_ptr[proc_items].involuntary_context_switches = 0; proc_stats_ptr[proc_items].start_time = 0; # if defined(HAVE_KINFO_PROC_KI_STAT) /* This is in microseconds */ proc_stats_ptr[proc_items].time_spent = kp_stats[i].ki_runtime / 1000000; proc_stats_ptr[proc_items].cpu_percent = 0; /* ki_pctcpu */ proc_stats_ptr[proc_items].nice = kp_stats[i].ki_nice; # elif defined(HAVE_KINFO_PROC_KP_PID) proc_stats_ptr[proc_items].time_spent = kp_stats[i].kp_ru.ru_utime.tv_sec; proc_stats_ptr[proc_items].time_spent += kp_stats[i].kp_ru.ru_stime.tv_sec; proc_stats_ptr[proc_items].cpu_percent = kp_stats[i].kp_lwp.kl_pctcpu; proc_stats_ptr[proc_items].time_spent = kp_stats[i].kp_start.tv_sec; proc_stats_ptr[proc_items].nice = kp_stats[i].kp_nice; # elif defined(HAVE_KINFO_PROC_KP_THREAD) proc_stats_ptr[proc_items].time_spent = ( kp_stats[i].kp_thread.td_uticks + kp_stats[i].kp_thread.td_sticks + kp_stats[i].kp_thread.td_iticks ) / 1000000; # else /* p_cpticks?, p_[usi]ticks? */ #if 0 /* This is in microseconds */ proc_stats_ptr[proc_items].time_spent = kp_stats[i].kp_proc.p_runtime / 1000000; #endif # endif # if defined(HAVE_KINFO_PROC_KI_STAT) proc_stats_ptr[proc_items].proc_size = kp_stats[i].ki_size; /* This is in pages */ proc_stats_ptr[proc_items].proc_resident = ((unsigned long long)kp_stats[i].ki_rssize) * sys_page_size; # elif defined(HAVE_KINFO_PROC_KP_PID) proc_stats_ptr[proc_items].proc_size = kp_stats[i].kp_vm_map_size; proc_stats_ptr[proc_items].proc_resident = ((unsigned long long)kp_stats[i].kp_vm_rssize) * sys_page_size; # elif defined(HAVE_KINFO_PROC_P_VM_MAP_SIZE) proc_stats_ptr[proc_items].proc_size = kp_stats[i].p_vm_map_size; proc_stats_ptr[proc_items].proc_resident = ((unsigned long long)kp_stats[i].p_vm_rssize) * sys_page_size; # else #if 0 /* This is in microseconds */ proc_stats_ptr[proc_items].proc_size = kp_stats[i].kp_eproc.e_vm.vm_map.size; /* This is in pages */ proc_stats_ptr[proc_items].proc_resident = kp_stats[i].kp_eproc.e_vm.vm_rssize * sys_page_size; #endif proc_stats_ptr[proc_items].nice = kp_stats[i].kp_proc.p_nice; # endif # if defined(HAVE_KINFO_PROC_KI_STAT) switch (kp_stats[i].ki_stat) # elif defined(HAVE_KINFO_PROC_KP_PID) switch (kp_stats[i].kp_stat) # elif defined(HAVE_KINFO_PROC_P_STAT) switch (kp_stats[i].p_stat) # else switch (kp_stats[i].kp_proc.p_stat) # endif { # ifdef SRUN case SRUN: proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_RUNNING; break; # endif # if defined(HAVE_KINFO_PROC_KP_PID) case SACTIVE: switch(kp_stats[proc_items].kp_lwp.kl_stat) { case LSRUN: proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_RUNNING; break; case LSSTOP: proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_STOPPED; break; case LSSLEEP: proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_SLEEPING; break; } break; # endif case SIDL: # ifdef SSLEEP case SSLEEP: # endif # ifdef SWAIT case SWAIT: /* FreeBSD 5 */ # endif # ifdef SLOCK case SLOCK: /* FreeBSD 5 */ # endif proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_SLEEPING; break; case SSTOP: proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_STOPPED; break; case SZOMB: # ifdef SDEAD case SDEAD: /* OpenBSD & NetBSD */ # endif proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_ZOMBIE; break; default: proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_UNKNOWN; break; } # if defined(KERN_PROC_ARGS) || defined(KERN_PROCARGS2) if( 0 != proc_stats_ptr[proc_items].pid ) { char *p; unsigned miblen; size = ARG_MAX * sizeof(*proctitle); *proctitle = '\0'; mib[0] = CTL_KERN; # if defined(KERN_PROC_ARGS) && defined(KERN_PROC_ARGV) mib[1] = KERN_PROC_ARGS; mib[2] = ((int)proc_stats_ptr[proc_items].pid); mib[3] = KERN_PROC_ARGV; miblen = 4; p = "CTL_KERN.KERN_PROC_ARGS.KERN_PROC_ARGV"; # elif defined(KERN_PROC_ARGS) && !defined(KERN_PROC_ARGV) mib[1] = KERN_PROC; mib[2] = KERN_PROC_ARGS; mib[3] = ((int)proc_stats_ptr[proc_items].pid); miblen = 4; p = "CTL_KERN.KERN_PROC.KERN_PROC_ARGS"; # elif defined(KERN_PROCARGS2) mib[1] = KERN_PROCARGS2; mib[2] = ((int)proc_stats_ptr[proc_items].pid); miblen = 3; p = "CTL_KERN.KERN_PROCARGS2"; # endif if( -1 == ( rc = sysctl(mib, miblen, proctitle, &size, NULL, 0) ) ) { # if defined(KERN_PROCARGS2) if( EINVAL == errno ) goto print_kernel_proctitle; # endif INFO_LOG_FMT("process", "sysctl(%s) for pid=" FMT_PID_T, p, proc_stats_ptr[proc_items].pid); continue; } if( size > 1 ) { char *pt = adjust_procname_cmndline( proctitle, size ); if( SG_ERROR_NONE != sg_update_string( &proc_stats_ptr[proc_items].proctitle, pt ) ) { VECTOR_UPDATE_ERROR_CLEANUP; RETURN_FROM_PREVIOUS_ERROR( "process", sg_get_error() ); } } else { goto print_kernel_proctitle; } } else { print_kernel_proctitle: if( -1 == asprintf( &proc_stats_ptr[proc_items].proctitle, "[%s]", proc_stats_ptr[proc_items].process_name ) ) { VECTOR_UPDATE_ERROR_CLEANUP; RETURN_WITH_SET_ERROR_WITH_ERRNO("process", SG_ERROR_ASPRINTF, NULL); } } # endif proc_stats_ptr[proc_items].systime = now; ++proc_items; } VECTOR_UPDATE(proc_stats_vector_ptr, proc_items, proc_stats_ptr, sg_process_stats); free(kp_stats); free(proctitle); #elif defined(HPUX) #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP free(pstat_procinfo); pstat_procinfo = malloc( PROCESS_BATCH * sizeof(pstat_procinfo[0]) ); if( NULL == pstat_procinfo ) { RETURN_WITH_SET_ERROR( "process", SG_ERROR_MALLOC, "sg_get_process_stats" ); } for(;;) { memset( pstat_procinfo, 0, PROCESS_BATCH * sizeof(pstat_procinfo[0]) ); num = pstat_getproc(pstat_procinfo, sizeof(pstat_procinfo[0]), PROCESS_BATCH, procidx); if (num == -1) { free(pstat_procinfo); RETURN_WITH_SET_ERROR_WITH_ERRNO("process", SG_ERROR_PSTAT, "pstat_getproc"); } else if (num == 0) { break; } VECTOR_UPDATE(proc_stats_vector_ptr, proc_items + num, proc_stats_ptr, sg_process_stats); for (i = 0; i < num; ++i) { struct pst_status *pi = &pstat_procinfo[i]; sg_error rc; proc_stats_ptr[proc_items].pid = pi->pst_pid; proc_stats_ptr[proc_items].parent = pi->pst_ppid; proc_stats_ptr[proc_items].pgid = pi->pst_pgrp; proc_stats_ptr[proc_items].uid = pi->pst_uid; proc_stats_ptr[proc_items].euid = pi->pst_euid; proc_stats_ptr[proc_items].gid = pi->pst_gid; proc_stats_ptr[proc_items].egid = pi->pst_egid; proc_stats_ptr[proc_items].context_switches = pi->pst_nvcsw + pi->pst_nivcsw; proc_stats_ptr[proc_items].voluntary_context_switches = pi->pst_nvcsw; proc_stats_ptr[proc_items].involuntary_context_switches = pi->pst_nivcsw; proc_stats_ptr[proc_items].proc_size = (pi->pst_dsize + pi->pst_tsize + pi->pst_ssize) * sys_page_size; proc_stats_ptr[proc_items].proc_resident = pi->pst_rssize * sys_page_size; proc_stats_ptr[proc_items].start_time = pi->pst_start; proc_stats_ptr[proc_items].time_spent = pi->pst_time; proc_stats_ptr[proc_items].cpu_percent = (pi->pst_pctcpu * 100.0) / 0x8000; proc_stats_ptr[proc_items].nice = pi->pst_nice; if ( ( SG_ERROR_NONE != ( rc = sg_update_string(&proc_stats_ptr[proc_items].process_name, pi->pst_ucomm ) ) ) || ( SG_ERROR_NONE != ( rc = sg_update_string(&proc_stats_ptr[proc_items].proctitle, pi->pst_cmd ) ) ) ) { free(pstat_procinfo); RETURN_FROM_PREVIOUS_ERROR( "process", rc ); } switch (pi->pst_stat) { case PS_SLEEP: proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_SLEEPING; break; case PS_RUN: proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_RUNNING; break; case PS_STOP: proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_STOPPED; break; case PS_ZOMBIE: proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_ZOMBIE; break; case PS_IDLE: case PS_OTHER: proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_UNKNOWN; break; } proc_stats_ptr[proc_items].systime = now; ++proc_items; } procidx = pstat_procinfo[num - 1].pst_idx + 1; } free(pstat_procinfo); #elif defined(AIX) #define TVALU_TO_SEC(x) ((x).tv_sec + ((double)((x).tv_usec) / 1000000.0)) #define TVALN_TO_SEC(x) ((x).tv_sec + ((double)((x).tv_usec) / 1000000000.0)) ncpus = sysconf(_SC_NPROCESSORS_ONLN); if( -1 == ncpus ) ncpus = 1; /* sysconf error - assume 1 */ procs = /* (struct procentry64 *) */ malloc(sizeof(*procs) * PROCS_TO_FETCH); if(NULL == procs) { RETURN_WITH_SET_ERROR_WITH_ERRNO("process", SG_ERROR_MALLOC, "sg_get_process_stats"); } if( NULL == ( cmndlinebuf = sg_malloc(ARG_MAX + 1) ) ) { free(procs); RETURN_WITH_SET_ERROR_WITH_ERRNO("process", SG_ERROR_MALLOC, "sg_get_process_stats"); } #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP free(procs); free(cmndlinebuf); gettimeofday(&now_tval, 0); now_time = TVALU_TO_SEC(now_tval); /* keep on grabbing chunks of processes until getprocs returns a smaller block than we asked for */ do { char *cmndline = NULL; int i; memset( procs, 0, sizeof(*procs) * PROCS_TO_FETCH ); fetched = getprocs64(procs, sizeof(*procs), NULL, 0, &index, PROCS_TO_FETCH); VECTOR_UPDATE(proc_stats_vector_ptr, proc_items + fetched, proc_stats_ptr, sg_process_stats); for( i = 0; i < fetched; ++i ) { struct procentry64 *pi = procs+i; int zombie = 0; sg_error rc; zombie = 0; /* set a descriptive name for the process state */ switch( pi->pi_state ) { case SSLEEP: proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_SLEEPING; break; case SRUN: proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_RUNNING; break; case SZOMB: proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_ZOMBIE; zombie = 1; break; case SSTOP: proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_STOPPED; break; case SACTIVE: proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_RUNNING; break; case SIDL: default: proc_stats_ptr[proc_items].state = SG_PROCESS_STATE_UNKNOWN; break; } if( zombie ) { utime = pi->pi_utime; stime = pi->pi_stime; } else { utime = TVALN_TO_SEC(pi->pi_ru.ru_utime); stime = TVALN_TO_SEC(pi->pi_ru.ru_stime); } proc_stats_ptr[proc_items].pid = pi->pi_pid; proc_stats_ptr[proc_items].parent = pi->pi_ppid; proc_stats_ptr[proc_items].pgid = pi->pi_pgrp; proc_stats_ptr[proc_items].uid = pi->pi_cred.crx_ruid; proc_stats_ptr[proc_items].euid = pi->pi_cred.crx_uid; proc_stats_ptr[proc_items].gid = pi->pi_cred.crx_rgid; proc_stats_ptr[proc_items].egid = pi->pi_cred.crx_gid; proc_stats_ptr[proc_items].context_switches = pi->pi_ru.ru_nvcsw + pi->pi_ru.ru_nivcsw; proc_stats_ptr[proc_items].voluntary_context_switches = pi->pi_ru.ru_nvcsw; proc_stats_ptr[proc_items].involuntary_context_switches = pi->pi_ru.ru_nivcsw; proc_stats_ptr[proc_items].proc_size = pi->pi_dvm * 4096; proc_stats_ptr[proc_items].proc_resident = (pi->pi_drss + pi->pi_trss) * 4096; /* XXX might be wrong, see P::PT */ proc_stats_ptr[proc_items].start_time = pi->pi_start; proc_stats_ptr[proc_items].time_spent = utime + stime; proc_stats_ptr[proc_items].cpu_percent = (((double)(utime + stime) * 100) / ( now_time - pi->pi_start )) / ncpus; proc_stats_ptr[proc_items].nice = pi->pi_nice; proc_stats_ptr[proc_items].systime = now; /* determine comm & cmndline */ if( (pi->pi_flags & SKPROC) == SKPROC ) { if( pi->pi_pid == 0 ) { snprintf(comm, sizeof(comm), "kproc (swapper)"); cmndline = NULL; } else { snprintf(comm, sizeof(comm), "kproc (%s)", pi->pi_comm); cmndline = NULL; } } else { snprintf(comm, sizeof(comm), "%s", pi->pi_comm); cmndline = cmndlinebuf; /* curproc_for_getargs.pi_pid = pi->pi_pid; if( getargs(&curproc_for_getargs, sizeof(curproc_for_getargs), cmndline, ARG_MAX) < 0 ) cmndline = NULL; else { adjust_procname_cmndline( cmndline, 0 ); } */ if( getargs(pi, sizeof(*pi), cmndline, ARG_MAX) < 0 ) cmndline = NULL; else { cmndline = adjust_procname_cmndline( cmndline, 0 ); } } if( NULL == cmndline ) rc = sg_update_string( &proc_stats_ptr[proc_items].proctitle, comm ); else rc = sg_update_string( &proc_stats_ptr[proc_items].proctitle, cmndline ); if( ( SG_ERROR_NONE != rc ) /* see above */ || ( SG_ERROR_NONE != ( rc = sg_update_string(&proc_stats_ptr[proc_items].process_name, comm ) ) ) ) { VECTOR_UPDATE_ERROR_CLEANUP; RETURN_FROM_PREVIOUS_ERROR( "process", rc ); } ++proc_items; } } while( fetched >= PROCS_TO_FETCH ); free(procs); free(cmndlinebuf); #else RETURN_WITH_SET_ERROR("process", SG_ERROR_UNSUPPORTED, OS_TYPE); #endif #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP if( proc_stats_vector_ptr && *proc_stats_vector_ptr && ( proc_items != (*proc_stats_vector_ptr)->used_count ) ) { VECTOR_UPDATE(proc_stats_vector_ptr, proc_items, proc_stats_ptr, sg_process_stats); } return SG_ERROR_NONE; } MULTI_COMP_ACCESS(sg_get_process_stats,process,process,SG_PROC_STAT_IDX) int sg_process_compare_name(const void *va, const void *vb) { const sg_process_stats *a = va, *b = vb; return strcmp(a->process_name, b->process_name); } int sg_process_compare_pid(const void *va, const void *vb) { const sg_process_stats *a = va, *b = vb; return (a->pid == b->pid) ? 0 : (a->pid < b->pid) ? -1 : 1; } int sg_process_compare_uid(const void *va, const void *vb) { const sg_process_stats *a = va, *b = vb; return (a->uid == b->uid) ? 0 : (a->uid < b->uid) ? -1 : 1; } int sg_process_compare_gid(const void *va, const void *vb) { const sg_process_stats *a = va, *b = vb; return (a->gid == b->gid) ? 0 : (a->gid < b->gid) ? -1 : 1; } int sg_process_compare_size(const void *va, const void *vb) { const sg_process_stats *a = va, *b = vb; return (a->proc_size == b->proc_size) ? 0 : (a->proc_size < b->proc_size) ? -1 : 1; } int sg_process_compare_res(const void *va, const void *vb) { const sg_process_stats *a = va, *b = vb; return (a->proc_resident == b->proc_resident) ? 0 : (a->proc_resident < b->proc_resident) ? -1 : 1; } int sg_process_compare_cpu(const void *va, const void *vb) { const sg_process_stats *a = va, *b = vb; return (a->cpu_percent == b->cpu_percent) ? 0 : (a->cpu_percent < b->cpu_percent) ? -1 : 1; } int sg_process_compare_time(const void *va, const void *vb) { const sg_process_stats *a = va, *b = vb; return (a->time_spent == b->time_spent) ? 0 : (a->time_spent < b->time_spent) ? -1 : 1; } #if 0 #ifdef WIN32 DWORD aProcesses[1024]; DWORD cbNeeded; if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded)) return NULL; process_stat.total = cbNeeded / sizeof(DWORD); #endif #endif static sg_error sg_get_process_count_int(sg_process_count *process_count_buf, const sg_vector *process_stats_vector) { const sg_process_stats *ps = VECTOR_DATA_CONST(process_stats_vector); size_t proc_count = process_stats_vector->used_count; process_count_buf->total = 0; process_count_buf->sleeping = 0; process_count_buf->running = 0; process_count_buf->zombie = 0; process_count_buf->stopped = 0; process_count_buf->unknown = 0; process_count_buf->total = proc_count; process_count_buf->systime = ps->systime; /* post increment is intention! */ while( proc_count-- ) { switch (ps[proc_count].state) { case SG_PROCESS_STATE_RUNNING: ++process_count_buf->running; break; case SG_PROCESS_STATE_SLEEPING: ++process_count_buf->sleeping; break; case SG_PROCESS_STATE_STOPPED: ++process_count_buf->stopped; break; case SG_PROCESS_STATE_ZOMBIE: ++process_count_buf->zombie; break; case SG_PROCESS_STATE_UNKNOWN: ++process_count_buf->unknown; break; default: /* currently no mapping for SG_PROCESS_STATE_UNKNOWN in * sg_process_count */ break; } } return SG_ERROR_NONE; } sg_process_count * sg_get_process_count_of(sg_process_count_source pcs) { struct sg_process_glob *process_glob = GLOBAL_GET_TLS(process); const sg_vector *process_stats_vector = NULL; /* to avoid wrong warning */ sg_process_count *process_count; TRACE_LOG("process", "entering sg_get_process_count_of"); if( !process_glob ) { /* assuming error comp can't neither */ ERROR_LOG("process", "sg_get_process_count_of failed - cannot get glob"); \ return NULL; } if(!process_glob->process_vectors[SG_PROC_COUNT_IDX]) process_glob->process_vectors[SG_PROC_COUNT_IDX] = VECTOR_CREATE(sg_process_count, 1); if(!process_glob->process_vectors[SG_PROC_COUNT_IDX]){ SET_ERROR("process", SG_ERROR_MALLOC, "sg_get_process_count_of"); return NULL; } process_count = VECTOR_DATA(process_glob->process_vectors[SG_PROC_COUNT_IDX]); switch(pcs) { case sg_last_process_count: process_stats_vector = process_glob->process_vectors[SG_PROC_STAT_IDX]; if( process_stats_vector ) break; /* else fallthrough */ case sg_entire_process_count: sg_get_process_stats(NULL); process_stats_vector = process_glob->process_vectors[SG_PROC_STAT_IDX]; break; default: SET_ERROR("process", SG_ERROR_INVALID_ARGUMENT, "sg_get_process_count_of(sg_process_count_source = %d)", (int)pcs); break; } if( !process_stats_vector ) { TRACE_LOG_FMT("process", "sg_get_cpu_percents_of failed with %s", sg_str_error(sg_get_error())); return NULL; } if( SG_ERROR_NONE == sg_get_process_count_int(process_count, process_stats_vector) ) { TRACE_LOG("process", "sg_get_cpu_percents_of succeded"); \ return process_count; } WARN_LOG_FMT("process", "sg_get_cpu_percents_of failed with %s", sg_str_error(sg_get_error())); return NULL; } sg_process_count * sg_get_process_count_r(sg_process_stats const * whereof) { sg_vector *process_count_result_vector; sg_process_count *process_count; sg_vector const *process_stats_vector = VECTOR_DATA_CONST(whereof); TRACE_LOG("process", "entering sg_get_process_count_r"); if( NULL == process_stats_vector ) { SET_ERROR("process", SG_ERROR_INVALID_ARGUMENT, "sg_get_process_count_r(whereof = %p)", whereof); return NULL; } process_count_result_vector = VECTOR_CREATE(sg_process_count, 1); if( NULL == process_count_result_vector ) { ERROR_LOG_FMT("process", "sg_get_process_count_r failed with %s", sg_str_error(sg_get_error())); return NULL; } process_count = VECTOR_DATA(process_count_result_vector); if( SG_ERROR_NONE == sg_get_process_count_int(process_count, process_stats_vector) ) { TRACE_LOG("process", "sg_get_process_count_r succeded"); return process_count; } WARN_LOG_FMT("process", "sg_get_process_count_r failed with %s", sg_str_error(sg_get_error())); sg_vector_free(process_count_result_vector); return NULL; } libstatgrab-0.90/src/libstatgrab/vector.c000644 001750 001750 00000024424 12200025312 020440 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #include "tools.h" #ifndef NDEBUG #define SG_VECTOR_START_EYE MAGIC_EYE('s','g','v','s') #define SG_VECTOR_FINAL_EYE MAGIC_EYE('f','v','g','s') #endif static void sg_vector_destroy_unused(struct sg_vector *vector, size_t new_count){ /* Destroy any now-unused items. * * Note that there's an assumption here that making the vector smaller * will never fail; if it did, then we would have destroyed items here * but not actually got rid of the vector pointing to them before the * error return.) */ if (new_count < vector->used_count && vector->info.destroy_fn != NULL) { char *data = VECTOR_DATA(vector); size_t i; i = vector->used_count; while( i > new_count ) { --i; vector->info.destroy_fn(data + i * vector->info.item_size); } } if (new_count < vector->used_count) vector->used_count = new_count; } static void sg_vector_init_new(struct sg_vector *vector, size_t new_count){ /* Initialise any new items. */ if (new_count > vector->used_count && vector->info.init_fn != NULL) { char *data = VECTOR_DATA(vector); size_t i; for( i = vector->used_count; i < new_count; ++i ){ vector->info.init_fn(data + i * vector->info.item_size); } } if (new_count > vector->used_count) vector->used_count = new_count; } sg_error sg_prove_vector(const sg_vector *vec) { TRACE_LOG_FMT("vector", "sg_prove_vector(%p)", vec); assert( SG_VECTOR_START_EYE == vec->start_eye ); assert( SG_VECTOR_FINAL_EYE == vec->final_eye ); return SG_ERROR_NONE; } static sg_error sg_prove_vector_compat(const sg_vector *one, const sg_vector *two) { TRACE_LOG_FMT("vector", "sg_prove_vector_compat(%p, %p)", one, two); assert( one ); assert( two ); assert( ( one->info.item_size == two->info.item_size ) && ( one->info.init_fn == two->info.init_fn ) && ( one->info.copy_fn == two->info.copy_fn ) && ( one->info.compute_diff_fn == two->info.compute_diff_fn ) && ( one->info.compare_fn == two->info.compare_fn ) && ( one->info.destroy_fn == two->info.destroy_fn ) ); return SG_ERROR_NONE; } #define NEXT_POWER2_IN(x,bs) ( ((( (x) - 1 ) >> (bs)) + 1) << (bs) ) static struct sg_vector * sg_vector_create_int(size_t block_shift, size_t alloc_count, size_t initial_used, const sg_vector_init_info * const info) { size_t round_count = NEXT_POWER2_IN(MAX(alloc_count, initial_used), block_shift); struct sg_vector *vector = sg_realloc(NULL, VECTOR_SIZE + round_count * info->item_size); if(vector) { TRACE_LOG_FMT("vector", "vector for %lu items allocated at %p", round_count, vector); #ifndef NDEBUG vector->start_eye = SG_VECTOR_START_EYE; vector->final_eye = SG_VECTOR_FINAL_EYE; #endif vector->info = *info; vector->block_shift = block_shift; vector->alloc_count = 1LU << block_shift; vector->used_count = 0; sg_vector_init_new(vector, initial_used); } return vector; } struct sg_vector * sg_vector_create(size_t block_size, size_t alloc_count, size_t initial_used, const sg_vector_init_info * const info) { size_t block_shift = 0; TRACE_LOG_FMT("vector", "allocating vector fitting for %lu items and use %lu of them", alloc_count, initial_used); while( ((unsigned)1 << block_shift) < block_size ) ++block_shift; return sg_vector_create_int( block_shift, alloc_count, initial_used, info ); } void sg_vector_free(struct sg_vector *vector) { if( !vector ) return; if(SG_ERROR_NONE == sg_prove_vector(vector)) { TRACE_LOG_FMT("vector", "freeing vector %p containing %lu items", vector, vector->used_count); sg_vector_destroy_unused(vector, 0); free( vector ); } } void sg_vector_clear(struct sg_vector *vector) { if( !vector ) return; if(SG_ERROR_NONE == sg_prove_vector(vector)) { TRACE_LOG_FMT("vector", "clearing vector %p containing %lu items", vector, vector->used_count); sg_vector_destroy_unused(vector, 0); } } struct sg_vector * sg_vector_resize(struct sg_vector *vector, size_t new_count) { size_t round_count; assert(vector); if( !vector ) { SET_ERROR("vector", SG_ERROR_INVALID_ARGUMENT, "sg_vector_resize: invalid argument value for vector"); return NULL; } if(SG_ERROR_NONE != sg_prove_vector(vector)) { SET_ERROR("vector", SG_ERROR_INVALID_ARGUMENT, "sg_vector_resize: invalid vector"); return NULL; } TRACE_LOG_FMT("vector", "resizing vector(%p) using %lu items to fit %lu items", vector, vector->used_count, new_count); if( 0U == new_count ){ sg_vector_free(vector); sg_clear_error(); return NULL; } sg_vector_destroy_unused(vector, new_count); /* Round up the desired size to the next multiple of the block size. */ round_count = NEXT_POWER2_IN(new_count, vector->block_shift); /* Resize the vector if necessary. */ if (round_count != vector->alloc_count) { sg_vector *new_vector; new_vector = sg_realloc(vector, VECTOR_SIZE + round_count * vector->info.item_size); if (new_vector == NULL && round_count != 0U) { /* Out of memory -- free the contents of the vector. */ sg_vector_free(vector); return NULL; } vector = new_vector; vector->alloc_count = round_count; } sg_vector_init_new(vector, new_count); TRACE_LOG_FMT("vector", "resized vector(%p) to fit %lu items", vector, round_count); return vector; } size_t sg_get_nelements(const void *data){ const sg_vector *vector = VECTOR_ADDRESS_CONST(data); return vector ? vector->used_count : 0; } static sg_error sg_vector_clone_into_int(sg_vector **dest, const sg_vector *src){ /* we can assume that everything is correct from caller perspective */ size_t i; sg_vector *tmp = ((*dest)->used_count == src->used_count) ? *dest : sg_vector_resize(*dest, src->used_count); char const *src_data = VECTOR_DATA_CONST(src); char *dest_data = VECTOR_DATA(tmp); size_t item_size = src->info.item_size; assert(src->info.copy_fn); if( !tmp ) { RETURN_FROM_PREVIOUS_ERROR( "vector", sg_get_error() ); } for( i = 0; i < src->used_count; ++i ) { sg_error rc = src->info.copy_fn( src_data + i * item_size, dest_data + i * item_size ); if( SG_ERROR_NONE != rc ) { sg_vector_free( tmp ); *dest = NULL; return rc; } } *dest = tmp; return SG_ERROR_NONE; } sg_error sg_vector_clone_into(sg_vector **dest, const sg_vector *src){ if( !dest ) { RETURN_WITH_SET_ERROR( "vector", SG_ERROR_INVALID_ARGUMENT, "dest" ); } if( !src ) { if(*dest) { sg_vector_free(*dest); *dest = NULL; } return SG_ERROR_NONE; } if(SG_ERROR_NONE != sg_prove_vector(src)) { RETURN_WITH_SET_ERROR( "vector", SG_ERROR_INVALID_ARGUMENT, "src" ); } if( !*dest ) { *dest = sg_vector_clone( src ); if( *dest ) return SG_ERROR_NONE; } else if( ( SG_ERROR_NONE == sg_prove_vector(*dest) ) && ( SG_ERROR_NONE == sg_prove_vector_compat(*dest, src) ) && ( SG_ERROR_NONE == sg_vector_clone_into_int( dest, src ) ) ) { return SG_ERROR_NONE; } sg_vector_free(*dest); *dest = NULL; return sg_get_error(); } sg_vector * sg_vector_clone(const sg_vector *src){ sg_vector *dest = NULL; if( !src ) return NULL; if( ( SG_ERROR_NONE == sg_prove_vector(src) ) && ( ( dest = sg_vector_create_int( src->block_shift, src->alloc_count, src->used_count, &src->info ) ) != NULL ) && ( SG_ERROR_NONE == sg_vector_clone_into_int( &dest, src ) ) ) { TRACE_LOG_FMT("vector", "cloned vector containing %lu items", src->used_count); return dest; } sg_vector_free(dest); return NULL; } sg_error sg_free_stats_buf(void *data){ if(NULL != data) { sg_vector *data_vector = VECTOR_ADDRESS(data); sg_vector_free(data_vector); return SG_ERROR_NONE; } return SG_ERROR_NONE; } sg_error sg_vector_compute_diff(sg_vector **dest_vector_ptr, const sg_vector *cur_vector, const sg_vector *last_vector) { if( NULL == dest_vector_ptr ) { RETURN_WITH_SET_ERROR("vector", SG_ERROR_INVALID_ARGUMENT, "sg_vector_compute_diff(dest_vector_ptr)"); } if( cur_vector ) { sg_error rc = sg_vector_clone_into( dest_vector_ptr, cur_vector ); /* proves *dest, cur */ if( SG_ERROR_NONE != rc ) { RETURN_FROM_PREVIOUS_ERROR( "vector", rc ); } if( NULL == *dest_vector_ptr ) return SG_ERROR_NONE; assert( cur_vector->info.compute_diff_fn ); assert( cur_vector->info.compare_fn ); TRACE_LOG_FMT("vector", "computing vector diff between vector containing %lu items (cur) and vector containing %lu items (last)", cur_vector->used_count, last_vector ? last_vector->used_count : 0 ); if( last_vector && ( SG_ERROR_NONE == sg_prove_vector(last_vector) ) && ( SG_ERROR_NONE == sg_prove_vector_compat(cur_vector, last_vector ) ) ) { size_t i, item_size = last_vector->info.item_size; unsigned matched[(cur_vector->used_count / (8 * sizeof(unsigned))) + 1]; char *diff = VECTOR_DATA(*dest_vector_ptr); char const *last = VECTOR_DATA_CONST(last_vector); memset( matched, 0, sizeof(matched) ); for( i = 0; i < (*dest_vector_ptr)->used_count; ++i ) { size_t j; for( j = 0; j < last_vector->used_count; ++j ) { if( BIT_ISSET(matched, j) ) /* already matched? */ continue; if (last_vector->info.compare_fn(last + j * item_size, diff + i * item_size) == 0) { BIT_SET(matched, j); last_vector->info.compute_diff_fn(last + j * item_size, diff + i * item_size); } } if( j == last_vector->used_count ) { /* We have lost an item since last time - skip */ } } /* XXX append the items lost since last run? */ } } else { sg_vector_free(*dest_vector_ptr); *dest_vector_ptr = NULL; RETURN_WITH_SET_ERROR("vector", SG_ERROR_INVALID_ARGUMENT, "sg_vector_compute_diff(cur_vector)"); } return SG_ERROR_NONE; } libstatgrab-0.90/src/libstatgrab/disk_stats.c000644 001750 001750 00000160601 12200025312 021304 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #include "tools.h" #ifdef DARWIN #include #include #include #include #include #endif #ifdef SOLARIS #define VALID_FS_TYPES {"ufs", "tmpfs", "vxfs", "nfs", "zfs", "lofs"} #elif defined(LINUX) #define VALID_FS_TYPES {"adfs", "affs", "befs", "bfs", "btrfs", "cifs", \ "efs", "ext2", "ext3", "ext4", "vxfs", "hfs", \ "hfsplus", "hpfs", "jffs", "jffs2", "jfs", "minix", \ "msdos", "nfs", "ntfs", "ocfs", "qnx4", "ramfs", \ "rootfs", "reiserfs", "sysv", "tmpfs", "v7", "udf", \ "ufs", "umsdos", "vfat", "xfs" } #elif defined(CYGWIN) #define VALID_FS_TYPES {"user"} #elif defined(DARWIN) #define VALID_FS_TYPES {"CoreStorage", "acfs", "afpfs", "autofs", "cd9660", \ "cddafs", "devfs", "exfat", "fdesc", "ftp", "hfs", \ "msdos", "nfs", "ntfs", "smbfs", "udf", "webdav"} #elif defined(FREEBSD) /*#define VALID_FS_TYPES {"hpfs", "msdosfs", "ntfs", "udf", "ext2fs", \ "ufs", "mfs", "nfs", "zfs", "tmpfs", "reiserfs", \ "xfs"}*/ #elif defined(DFBSD) #define VALID_FS_TYPES {"hammer", "msdosfs", "ntfs", "udf", "ext2fs", \ "ufs", "mfs", "nfs", "tmpfs"} #elif defined(NETBSD) || defined(OPENBSD) #define VALID_FS_TYPES {"ffs", "mfs", "msdos", "lfs", "adosfs", "ext2fs", \ "ntfs", "nfs"} #elif defined(HPUX) #define VALID_FS_TYPES {"vxfs", "hfs", "nfs"} #elif defined(AIX) #define VALID_FS_TYPES { \ "jfs2", /* 0 */ \ "namefs", /* 1 */ \ "nfs", /* 2 */ \ "jfs", /* 3 */ \ NULL, /* 4 */ \ "cdrom", /* 5 */ \ "procfs", /* 6 */ \ NULL, /* 7 */ \ NULL, /* 8 */ \ NULL, /* 9 */ \ NULL, /* 10 */ \ NULL, /* 11 */ \ NULL, /* 12 */ \ NULL, /* 13 */ \ NULL, /* 14 */ \ NULL, /* 15 */ \ "sfs", /* 16 */ \ "cachefs", /* 17 */ \ "nfs3", /* 18 */ \ "autofs", /* 19 */ \ NULL, /* 20 */ \ NULL, /* 21 */ \ NULL, /* 22 */ \ NULL, /* 23 */ \ NULL, /* 24 */ \ NULL, /* 25 */ \ NULL, /* 26 */ \ NULL, /* 27 */ \ NULL, /* 28 */ \ NULL, /* 29 */ \ NULL, /* 30 */ \ NULL, /* 31 */ \ "vxfs", /* 32 */ \ "vxodm", /* 33 */ \ "udf", /* 34 */ \ "nfs4", /* 35 */ \ "rfs4", /* 36 */ \ "cifs" /* 37 */ \ } static char **sys_fs_types; static size_t num_sys_fs_types; #ifndef HAVE_DECL_MNTCTL extern int mntctl(int, int, void *); #endif #elif defined(WIN32) #define VALID_FS_TYPES {"NTFS", "FAT", "FAT32"}; #endif static size_t num_valid_file_systems = 0; static char **valid_file_systems = NULL; static void sg_fs_stats_item_init(sg_fs_stats *d) { d->device_name = NULL; d->fs_type = NULL; d->mnt_point = NULL; } static sg_error sg_fs_stats_item_copy(const sg_fs_stats *s, sg_fs_stats *d) { if( SG_ERROR_NONE != sg_update_string(&d->device_name, s->device_name) || SG_ERROR_NONE != sg_update_string(&d->fs_type, s->fs_type) || SG_ERROR_NONE != sg_update_string(&d->mnt_point, s->mnt_point) ) { RETURN_FROM_PREVIOUS_ERROR( "disk", sg_get_error() ); } d->device_type = s->device_type; d->size = s->size; d->used = s->used; d->free = s->free; d->avail = s->avail; d->total_inodes = s->total_inodes; d->used_inodes = s->used_inodes; d->free_inodes = s->free_inodes; d->avail_inodes = s->avail_inodes; d->io_size = s->io_size; d->block_size = s->block_size; d->total_blocks = s->total_blocks; d->free_blocks = s->free_blocks; d->used_blocks = s->used_blocks; d->avail_blocks = s->avail_blocks; d->systime = s->systime; return SG_ERROR_NONE; } static sg_error sg_fs_stats_item_compute_diff(const sg_fs_stats *s, sg_fs_stats *d) { d->size -= s->size; d->used -= s->used; d->avail -= s->avail; d->total_inodes -= s->total_inodes; d->used_inodes -= s->used_inodes; d->free_inodes -= s->free_inodes; d->avail_inodes -= s->avail_inodes; d->io_size -= s->io_size; d->block_size -= s->block_size; d->total_blocks -= s->total_blocks; d->free_blocks -= s->free_blocks; d->used_blocks -= s->used_blocks; d->avail_blocks -= s->avail_blocks; return SG_ERROR_NONE; } static int sg_fs_stats_item_compare(const sg_fs_stats *a, const sg_fs_stats *b) { int rc; rc = strcmp(a->device_name, b->device_name); if( 0 != rc ) return rc; rc = strcmp(a->mnt_point, b->mnt_point); if( 0 != rc ) return rc; rc = strcmp(a->fs_type, b->fs_type); if( 0 != rc ) return rc; return 0; } static void sg_fs_stats_item_destroy(sg_fs_stats *d) { free(d->device_name); free(d->fs_type); free(d->mnt_point); } static void sg_disk_io_stats_item_init(sg_disk_io_stats *d) { d->disk_name = NULL; } static sg_error sg_disk_io_stats_item_copy(const sg_disk_io_stats *s, sg_disk_io_stats *d) { if( SG_ERROR_NONE != sg_update_string(&d->disk_name, s->disk_name) ) { RETURN_FROM_PREVIOUS_ERROR( "disk", sg_get_error() ); } d->read_bytes = s->read_bytes; d->write_bytes = s->write_bytes; d->systime = s->systime; return SG_ERROR_NONE; } static sg_error sg_disk_io_stats_item_compute_diff(const sg_disk_io_stats *s, sg_disk_io_stats *d) { d->read_bytes -= s->read_bytes; d->write_bytes -= s->write_bytes; d->systime -= s->systime; return SG_ERROR_NONE; } static int sg_disk_io_stats_item_compare(const sg_disk_io_stats *a, const sg_disk_io_stats *b) { return strcmp(a->disk_name, b->disk_name); } static void sg_disk_io_stats_item_destroy(sg_disk_io_stats *d) { free(d->disk_name); d->disk_name = NULL; } VECTOR_INIT_INFO_FULL_INIT(sg_fs_stats); VECTOR_INIT_INFO_FULL_INIT(sg_disk_io_stats); static int cmp_valid_fs(const void *va, const void *vb) { const char *a = * (char * const *)va; const char *b = * (char * const *)vb; if( a && b ) return strcasecmp(a, b); /* force NULL sorted at end */ if( a && !b ) return -1; if( !a && b ) return 1; return 0; } static sg_error init_valid_fs_types(void) { sg_error errc = SG_ERROR_NONE; size_t i; #define FILL_VALID_FS #if defined(HAVE_STRUCT_XVFSCONF) && defined(HAVE_SYSCTLBYNAME) struct xvfsconf *vfsp; size_t buflen; /* XXX use sysctl(mib[]) instead of sysctlbyname() - better testable in configure */ if( sysctlbyname("vfs.conflist", NULL, &buflen, NULL, 0) < 0 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", SG_ERROR_SYSCTLBYNAME, "vfs.conflist"); } if( NULL == (vfsp = sg_malloc(buflen) ) ) { RETURN_FROM_PREVIOUS_ERROR( "disk", sg_get_error() ); } if( sysctlbyname("vfs.conflist", vfsp, &buflen, NULL, 0) < 0 ) { free(vfsp); RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", SG_ERROR_SYSCTLBYNAME, "vfs.conflist"); } num_valid_file_systems = buflen / sizeof(*vfsp); #define CLEANUP_INIT_VALID_FS free(vfsp); #define CUR_VALID_FS vfsp[i].vfc_name #elif defined(HAVE_STRUCT_VFSCONF) && defined(VFS_CONF) const char *int_valid_fs[] = VALID_FS_TYPES; struct vfsconf *vfsp = 0; size_t buflen; int nbvfs = 0, k; int mib[4] = { CTL_VFS, VFS_GENERIC, VFS_MAXTYPENUM }; buflen = sizeof(nbvfs); if( sysctl(mib, 3, &nbvfs, &buflen, (void *)0, (size_t)0) < 0 ) { SET_ERROR_WITH_ERRNO("disk", SG_ERROR_SYSCTL, "vfs.generic.maxtypenum"); free(vfsp); vfsp = NULL; nbvfs = 0; num_valid_file_systems = lengthof(int_valid_fs); } vfsp = calloc( nbvfs, sizeof(*vfsp) ); if( NULL == vfsp ) { SET_ERROR_WITH_ERRNO("disk", SG_ERROR_MALLOC, "calloc for vfs.generic.conf"); free(vfsp); vfsp = NULL; nbvfs = 0; num_valid_file_systems = lengthof(int_valid_fs); } if( vfsp ) { mib[2] = VFS_CONF; for( k = 0; k < nbvfs; ++k ) { mib[3] = k + 1; buflen = sizeof(vfsp[k]); if( sysctl(mib, 4, &vfsp[k], &buflen, (void *)0, (size_t)0) < 0 ) { if (errno == EOPNOTSUPP || errno == ENOTSUP) { continue; } SET_ERROR_WITH_ERRNO("disk", SG_ERROR_SYSCTL, "vfs.generic.conf.%d", k+1); free(vfsp); vfsp = NULL; nbvfs = 0; num_valid_file_systems = lengthof(int_valid_fs); break; } } if( vfsp ) { num_valid_file_systems = nbvfs; } } #define CLEANUP_INIT_VALID_FS free(vfsp); #define CUR_VALID_FS (vfsp ? vfsp[i].vfc_name : int_valid_fs[i] ) #define CAN_SHRINK_VALID_FS #elif defined(HAVE_SYSCTLBYNAME) && defined(CTL_VFS_NAMES) size_t fsnamebuflen; const char *int_valid_fs[] = VALID_FS_TYPES; char *fsnamebuf = 0, *fsname = 0; if( sysctlbyname("vfs.generic.fstypes", NULL, &fsnamebuflen, NULL, 0) < 0 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", SG_ERROR_SYSCTLBYNAME, "vfs.generic.fstypes"); } if( fsnamebuflen > 1 ) { if( NULL == (fsnamebuf = sg_malloc(fsnamebuflen + 1) ) ) { RETURN_FROM_PREVIOUS_ERROR( "disk", sg_get_error() ); } if( sysctlbyname("vfs.generic.fstypes", fsnamebuf, &fsnamebuflen, NULL, 0) < 0 ) { free(fsnamebuf); RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", SG_ERROR_SYSCTLBYNAME, "vfs.generic.fstypes"); } fsname = fsnamebuf; num_valid_file_systems = 1; while( ((size_t)(fsname - fsnamebuf)) < fsnamebuflen ) { if( *fsname == ' ' ) { *fsname = '\0'; ++num_valid_file_systems; } ++fsname; } fsname = fsnamebuf; } #define CLEANUP_INIT_VALID_FS do { if( fsnamebuf ) free(fsnamebuf); } while(0); #define CUR_VALID_FS fsnamebuf ? (0 == i) ? fsname : (fsname += strlen(fsname)+1) : int_valid_fs[i] #elif defined(HAVE_SYSFS) && defined(FSTYPSZ) && defined(GETNFSTYP) && defined(GETFSTYP) const char *int_valid_fs[] = VALID_FS_TYPES; int max_fs_type; struct { char name[FSTYPSZ]; } *valid_sysfs = NULL; max_fs_type = sysfs(GETNFSTYP); if( max_fs_type > 0 ) { valid_sysfs = calloc( max_fs_type, sizeof(*valid_sysfs) ); if( NULL != valid_sysfs ) { int i; for( i = 0, num_valid_file_systems = 0; i < max_fs_type; ++i, ++num_valid_file_systems ) { sysfs( GETFSTYP, i, &valid_sysfs[i] ); } } else { num_valid_file_systems = lengthof(int_valid_fs); } } else { num_valid_file_systems = lengthof(int_valid_fs); } #define CLEANUP_INIT_VALID_FS free(valid_sysfs); #define CUR_VALID_FS (valid_sysfs ? valid_sysfs[i].name : int_valid_fs[i]) #define CAN_SHRINK_VALID_FS #elif defined(AIX) FILE *fh; const char *int_valid_fs[] = VALID_FS_TYPES; num_sys_fs_types = num_valid_file_systems = lengthof(int_valid_fs); sys_fs_types = calloc( num_valid_file_systems, sizeof(sys_fs_types[0]) ); if( NULL == sys_fs_types ) { num_sys_fs_types = num_valid_file_systems = 0; RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", SG_ERROR_MALLOC, "init_valid_fs_types"); } for (i = 0; i < num_valid_file_systems; ++i) { if( SG_ERROR_NONE != ( errc = sg_update_string( &sys_fs_types[i], int_valid_fs[i] ) ) ) { num_sys_fs_types = num_valid_file_systems = 0; free(sys_fs_types); sys_fs_types = 0; RETURN_FROM_PREVIOUS_ERROR( "disk", errc ); } } /* XXX probably better use setvfsent(),getvfsent(),endvfsent() */ fh = fopen("/etc/vfs", "r"); if( 0 != fh ) { char line[1024]; while( fgets( line, sizeof(line), fh ) ) { char fstype[16], mnt_helper[PATH_MAX], filesys_helper[PATH_MAX], remote[16]; if( line[0] < 'a' || line[0] > 'z' ) { continue; /* not a valid fstype */ } if( sscanf(line, "%s %lu %s %s %s", fstype, &i, mnt_helper, filesys_helper, remote) < 4 ) { continue; /* couldn't parse */ } if( i >= num_sys_fs_types ) { /* fs-index starts at 0, so always alloc one more than index */ char **tmp = sg_realloc( sys_fs_types, sizeof(sys_fs_types[0]) * (i + 1) ); if( NULL == tmp ) { RETURN_FROM_PREVIOUS_ERROR( "disk", sg_get_error() ); } sys_fs_types = tmp; memset( &sys_fs_types[num_sys_fs_types], 0, (i + 1 - num_sys_fs_types) * sizeof(sys_fs_types[0]) ); num_valid_file_systems = num_sys_fs_types = i + 1; } if( SG_ERROR_NONE != ( errc = sg_update_string( &sys_fs_types[i], fstype ) ) ) { fclose(fh); free(sys_fs_types); num_sys_fs_types = num_valid_file_systems = 0; sys_fs_types = 0; RETURN_FROM_PREVIOUS_ERROR( "disk", errc ); } } fclose(fh); } #define CLEANUP_INIT_VALID_FS #define CUR_VALID_FS sys_fs_types[i] #define CAN_SHRINK_VALID_FS #elif defined(LINUX) #undef FILL_VALID_FS FILE *fh; const char *int_valid_fs[] = VALID_FS_TYPES; if( NULL != ( fh = fopen( "/proc/filesystems", "r" ) ) ) { regex_t re; const char *proc_fs_list_regex = "^([[:alnum:]]+)?[[:blank:]]+([[:alnum:]]+)"; int rc; char line[4096]; regmatch_t pmatch[3]; /* to fit for entire match, 1st and 2nd bracket content */ i = 0; num_valid_file_systems = 15; valid_file_systems = calloc( num_valid_file_systems + 1, sizeof(char *) ); if( ( rc = regcomp(&re, proc_fs_list_regex, REG_EXTENDED) ) != 0 ) { WARN_LOG_FMT( "disk", "error parsing regex '%s': %d", proc_fs_list_regex, rc ); free(valid_file_systems); fclose(fh); goto use_builtin_fs; } while( fgets( line, sizeof(line), fh ) ) { if( 0 == ( rc = regexec( &re, line, lengthof(pmatch), pmatch, 0 ) ) ) { char *fs_name = line + pmatch[2].rm_so; line[pmatch[2].rm_eo] = '\0'; if( i >= num_valid_file_systems ) { /* valid_file_systems has NULL termination, so always alloc one more than index */ char **tmp = sg_realloc( valid_file_systems, sizeof(tmp[0]) * ((num_valid_file_systems += 16) + 1) ); if( NULL == tmp ) { regfree( &re ); fclose( fh ); free(valid_file_systems); num_valid_file_systems = 0; valid_file_systems = NULL; RETURN_FROM_PREVIOUS_ERROR( "disk", sg_get_error() ); } valid_file_systems = tmp; memset( &valid_file_systems[i], 0, ((num_valid_file_systems + 1) - i) * sizeof(valid_file_systems[0]) ); } if( SG_ERROR_NONE != ( errc = sg_update_string( &valid_file_systems[i], fs_name ) ) ) { regfree( &re ); fclose( fh ); free(valid_file_systems); num_valid_file_systems = 0; valid_file_systems = NULL; RETURN_FROM_PREVIOUS_ERROR( "disk", errc ); } ++i; } } regfree( &re ); fclose( fh ); } else { use_builtin_fs: valid_file_systems = calloc( num_valid_file_systems + 1, sizeof(char *) ); if( 0 == valid_file_systems ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", SG_ERROR_MALLOC, "init_valid_fs_types"); } for( i = 0; i < num_valid_file_systems; ++i ) { if( SG_ERROR_NONE != ( errc = sg_update_string( &valid_file_systems[i], int_valid_fs[i] ) ) ) { WARN_LOG_FMT("disk", "couldn't update index " FMT_SIZE_T " for list of valid file systems", i); RETURN_FROM_PREVIOUS_ERROR( "disk", errc ); } } } #else const char *int_valid_fs[] = VALID_FS_TYPES; num_valid_file_systems = lengthof(int_valid_fs); #define CLEANUP_INIT_VALID_FS #define CUR_VALID_FS int_valid_fs[i] #endif /* sys-dependent initialization */ #ifdef FILL_VALID_FS valid_file_systems = calloc( num_valid_file_systems + 1, sizeof(*valid_file_systems) ); if( 0 == valid_file_systems ) { CLEANUP_INIT_VALID_FS RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", SG_ERROR_MALLOC, "init_valid_fs_types"); } for( i = 0; i < num_valid_file_systems; ++i ) { const char *cvfs = CUR_VALID_FS; if( cvfs && strlen(cvfs) ) { if( SG_ERROR_NONE != ( errc = sg_update_string( &valid_file_systems[i], cvfs ) ) ) { CLEANUP_INIT_VALID_FS WARN_LOG_FMT("disk", "couldn't update index " FMT_SIZE_T " for list of valid file systems", i); RETURN_FROM_PREVIOUS_ERROR( "disk", errc ); } } } CLEANUP_INIT_VALID_FS #endif /* gaps will be sorted to end */ qsort( valid_file_systems, num_valid_file_systems, sizeof(valid_file_systems[0]), cmp_valid_fs ); #if defined(CAN_SHRINK_VALID_FS) /* shrink list of valid fs to remove gaps in sys_fs_types list */ for (i = 0; i < num_valid_file_systems; ++i) { if( NULL == valid_file_systems[i] ) { break; } } #endif #if defined(CAN_SHRINK_VALID_FS) || defined(LINUX) if( i < num_valid_file_systems ) { char **tmp; num_valid_file_systems = i; tmp = sg_realloc( valid_file_systems, (num_valid_file_systems + 1) * sizeof(valid_file_systems[0]) ); /* doesn't matter when it fails, there're only unused NULL's at the end */ if( tmp ) valid_file_systems = tmp; } #endif return SG_ERROR_NONE; } const char ** sg_get_valid_filesystems(size_t *entries) { if( entries ) (*entries) = num_valid_file_systems; return (const char **)valid_file_systems; } sg_error sg_set_valid_filesystems(const char *valid_fs[]) { size_t num_new_valid_fs = 0, tmp; char **new_valid_fs = NULL; char ** old_valid_fs = valid_file_systems; size_t num_old_valid_fs = num_valid_file_systems; /* XXX this must be locked - from caller ? */ if( valid_fs && *valid_fs ) { while( valid_fs[num_new_valid_fs++] ) {} /* Note: post-inc is intensional */ new_valid_fs = calloc( num_new_valid_fs + 1, sizeof(char *) ); if( 0 == new_valid_fs ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", SG_ERROR_MALLOC, "set_valid_filesystems"); } tmp = num_new_valid_fs; while( tmp-- ) { sg_error errc; if( SG_ERROR_NONE != ( errc = sg_update_string( &new_valid_fs[tmp], valid_fs[tmp] ) ) ) { WARN_LOG_FMT("disk", "couldn't update index " FMT_SIZE_T " for list of valid file systems", tmp); while( valid_fs[tmp] ) { free(new_valid_fs[tmp]); ++tmp; } RETURN_FROM_PREVIOUS_ERROR( "disk", errc ); } } qsort( new_valid_fs, num_new_valid_fs, sizeof(new_valid_fs[0]), cmp_valid_fs ); } valid_file_systems = new_valid_fs; num_valid_file_systems = num_new_valid_fs; if( old_valid_fs ) { size_t i; for( i = 0; i < num_old_valid_fs; ++i ) free( old_valid_fs[i] ); free( old_valid_fs ); } return SG_ERROR_NONE; } static int is_valid_fs_type(const char *type) { char *key = bsearch( &type, valid_file_systems, num_valid_file_systems, sizeof(valid_file_systems[0]), cmp_valid_fs ); TRACE_LOG_FMT( "disk", "is_valid_fs_type(%s): %d", type, key != NULL ); return key != NULL; } #ifdef WIN32 #define BUFSIZE MAX_PATH+1 struct sg_win32_drvent { UINT drive_type; TCHAR volume_name_buf[BUFSIZE]; DWORD volume_serial; DWORD max_component_len; DWORD fs_flags; TCHAR filesys_name_buf[BUFSIZE]; }; static DWORD getdrvent(LPTSTR vol, unsigned check_mask, struct sg_win32_drvent *buf) { char drive[4] = " :\\"; assert(vol); assert(buf); if( isalpha(*vol) ) { *drive = *vol; vol = drive; } buf->drive_type = GetDriveType(vol); if( ( DRIVE_UNKNOWN == buf->drive_type ) || ( DRIVE_NO_ROOT_DIR == buf->drive_type ) ) return 1; if( check_mask & ( 1 << buf->drive_type ) ) { return GetVolumeInformation( vol, &buf->volume_name_buf, sizeof(buf->volume_name_buf), &buf->volume_serial, &buf->max_component_len, &buf->fs_flags, &buf->filesys_name_buf, sizeof(buf->filesys_name_buf) ); } return 1; } #endif /* * setup code */ #define SG_FS_STAT_NOW_IDX 0 #define SG_FS_STAT_DIFF_IDX 1 #define SG_DISK_IO_NOW_IDX 2 #define SG_DISK_IO_DIFF_IDX 3 #define SG_DISK_IDX_COUNT 4 EXTENDED_COMP_SETUP(disk,SG_DISK_IDX_COUNT,NULL); #if 0 #ifdef LINUX static regex_t not_part_re, part_re; #endif #endif #ifdef DARWIN static mach_port_t masterPort; #endif static sg_error sg_disk_init_comp(unsigned id){ sg_error rc; GLOBAL_SET_ID(disk,id); if( SG_ERROR_NONE != ( rc = init_valid_fs_types() ) ){ RETURN_FROM_PREVIOUS_ERROR( "disk", rc ); } #if 0 #ifdef LINUX if (regcomp(&part_re, "^(.*/)?[^/]*[0-9]$", REG_EXTENDED | REG_NOSUB) != 0) { RETURN_WITH_SET_ERROR("disk", SG_ERROR_PARSE, NULL); /* with regex errcode */ } if (regcomp(¬_part_re, "^(.*/)?[^/0-9]+[0-9]+d[0-9]+$", REG_EXTENDED | REG_NOSUB) != 0) { RETURN_WITH_SET_ERROR("disk", SG_ERROR_PARSE, NULL); } #endif #endif #ifdef DARWIN /* * Get the I/O Kit communication handle. */ IOMasterPort(bootstrap_port, &masterPort); #endif return SG_ERROR_NONE; } static void sg_disk_destroy_comp(void) { #if 0 #ifdef LINUX regfree(&part_re); regfree(¬_part_re); #endif #endif if( valid_file_systems ) { size_t i; for( i = 0; i < num_valid_file_systems; ++i ) free( valid_file_systems[i] ); free( valid_file_systems ); valid_file_systems = NULL; } #if defined(AIX) if( sys_fs_types ) { size_t i; for( i = 0; i < num_sys_fs_types; ++i ) free( valid_file_systems[i] ); free( sys_fs_types ); sys_fs_types = NULL; } #endif } EASY_COMP_CLEANUP_FN(disk,SG_DISK_IDX_COUNT) /* * real stuff */ static sg_error sg_get_fs_list_int(sg_vector **fs_stats_vector_ptr) { size_t num_fs = 0; sg_fs_stats *fs_ptr; time_t now = time(NULL); #if defined(HAVE_GETVFSSTAT) struct statvfs *mntbuf; int fs_count, i; #define GETMOUNTS_FN getvfsstat #elif defined(HAVE_GETFSSTAT) struct statfs *mntbuf; int fs_count, i; #define GETMOUNTS_FN getfsstat #if !defined(ST_NOWAIT) && defined(MNT_NOWAIT) #define ST_NOWAIT MNT_NOWAIT #endif #elif defined(HAVE_MNTCTL) struct vmount *buf, *mp; size_t bufsize = 4096; ssize_t rc, i; #elif defined(HAVE_GETMNTENT_R) || defined(HAVE_THREADSAFE_GETMNTENT) FILE *f; # ifdef HAVE_GETMNTENT_R char buf[4096]; # ifdef HAVE_STRUCT_MNTENT struct mntent mp; # ifdef GETMNTENT_R_RETURN_INT int rc; # else struct mntent *rc; # endif # endif # elif defined(HAVE_THREADSAFE_GETMNTENT) # if defined(HAVE_STRUCT_MNTTAB) struct mnttab mp; int rc; /* XXX exists an struct mnttab *getmntent(FILE *f); ? */ # elif defined(HAVE_STRUCT_MNTENT) struct mntent *mp, *rc; # endif # endif # ifndef MNT_MNTTAB static const char *mnttabs[] = { "/etc/mnttab", "/etc/mtab" }; unsigned i; # endif #elif defined(WIN32) LPTSTR buf = NULL, p; DWORD dynbuflen; struct sg_win32_drvent mp; /* lp_buf[0]='\0'; */ #endif assert(fs_stats_vector_ptr); #if defined(HAVE_GETVFSSTAT) || defined(HAVE_GETFSSTAT) # define return_set_mnt_error(error, mount_fn) RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", error, #mount_fn) # ifdef ST_NOWAIT # define GETMOUNTS_FLAG ST_NOWAIT # elif defined(MNT_NOWAIT) # define GETMOUNTS_FLAG MNT_NOWAIT # endif fs_count = GETMOUNTS_FN(NULL, 0, GETMOUNTS_FLAG); if( fs_count < 0 ) { return_set_mnt_error(SG_ERROR_GETMNTINFO, #GETMOUNTS_FN); } if( 0 == fs_count ) { VECTOR_UPDATE(fs_stats_vector_ptr, 0, fs_ptr, sg_fs_stats); return SG_ERROR_NONE; } mntbuf = malloc( sizeof(*mntbuf) * (size_t)fs_count ); if( NULL == mntbuf ) { return_set_mnt_error(SG_ERROR_MALLOC, #GETMOUNTS_FN); } if( fs_count != GETMOUNTS_FN(mntbuf, fs_count * sizeof(*mntbuf), GETMOUNTS_FLAG) ) { free(mntbuf); return_set_mnt_error(SG_ERROR_GETMNTINFO, #GETMOUNTS_FN); } #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP free(mntbuf); VECTOR_UPDATE(fs_stats_vector_ptr, fs_count, fs_ptr, sg_fs_stats); #define SG_FS_LOOP_INIT i = 0 #define SG_FS_LOOP_COND i < fs_count #define SG_FS_LOOP_ITER ++i #define SG_FS_FSTYPENAME mntbuf[i].f_fstypename #define SG_FS_DEVNAME mntbuf[i].f_mntfromname #define SG_FS_MOUNTP mntbuf[i].f_mntonname #define SG_FS_DEVTYPE sg_fs_unknown #elif defined(HAVE_MNTCTL) if( NULL == sys_fs_types ) { RETURN_WITH_SET_ERROR( "disk", SG_ERROR_INITIALISATION, "sys_fs_types" ); } buf = malloc( bufsize ); if( NULL == buf ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", SG_ERROR_MALLOC, "mntctl"); } rc = mntctl( MCTL_QUERY, bufsize, (char *)buf ); if( 0 == rc ) { bufsize = buf->vmt_revision; /* AIX misuses this field as "required size" */ void *newbuf = realloc( buf, bufsize ); if( NULL == newbuf ) { free(buf); RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", SG_ERROR_MALLOC, "mntctl"); } buf = newbuf; rc = mntctl( MCTL_QUERY, bufsize, (char *)buf ); } if( -1 == rc ) { free(buf); RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", SG_ERROR_SYSCTLBYNAME, "mntctl"); } #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP free(buf); VECTOR_UPDATE(fs_stats_vector_ptr, rc, fs_ptr, sg_fs_stats); #define SG_FS_LOOP_INIT i = 0, mp = buf #define SG_FS_LOOP_COND i < rc #define SG_FS_LOOP_ITER ++i, mp = (struct vmount *)(((char *)mp) + mp->vmt_length ) #define SG_FS_FSTYPENAME sys_fs_types[mp->vmt_gfstype] #define SG_FS_DEVNAME vmt2dataptr(mp,0) #define SG_FS_MOUNTP vmt2dataptr(mp,1) #define SG_FS_DEVTYPE sg_fs_unknown #elif defined(HAVE_GETMNTENT_R) || defined(HAVE_THREADSAFE_GETMNTENT) # ifdef MNT_MNTTAB f = setmntent(MNT_MNTTAB, "r"); # else for( i = 0; i < lengthof(mnttabs); ++i ) { if( NULL != ( f = setmntent(mnttabs[i], "r") ) ) break; } # endif if( NULL == f ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", SG_ERROR_SETMNTENT, NULL); } #define NEED_VECTOR_UPDATE #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP endmntent(f); # if defined(HAVE_GETMNTENT_R) # define SG_FS_LOOP_INIT rc = getmntent_r(f, &mp, buf, sizeof(buf)) # elif defined(HAVE_THREADSAFE_GETMNTENT) # ifdef HAVE_STRUCT_MNTTAB # define SG_FS_LOOP_INIT rc = getmntent(f, &mp) # else # define SG_FS_LOOP_INIT rc = mp = getmntent(f) # endif # endif # if defined(GETMNTENT_R_RETURN_INT) || defined(HAVE_STRUCT_MNTTAB) # define SG_FS_LOOP_COND rc == 0 # else # define SG_FS_LOOP_COND rc != NULL # endif #define SG_FS_LOOP_ITER SG_FS_LOOP_INIT # ifdef HAVE_STRUCT_MNTENT # ifdef HAVE_GETMNTENT_R # define SG_FS_FSTYPENAME mp.mnt_type # define SG_FS_DEVNAME mp.mnt_fsname # define SG_FS_MOUNTP mp.mnt_dir # define SG_FS_DEVTYPE sg_fs_unknown # else # define SG_FS_FSTYPENAME mp->mnt_type # define SG_FS_DEVNAME mp->mnt_fsname # define SG_FS_MOUNTP mp->mnt_dir # define SG_FS_DEVTYPE sg_fs_unknown # endif # elif defined(HAVE_STRUCT_MNTTAB) # define SG_FS_FSTYPENAME mp.mnt_fstype # define SG_FS_DEVNAME mp.mnt_special # define SG_FS_MOUNTP mp.mnt_mountp # define SG_FS_DEVTYPE sg_fs_unknown # endif #elif defined(WIN32) dynbuflen = GetLogicalDriveStrings(0, NULL); if( 0 == dynbuflen ) { RETURN_WITH_SET_ERROR("disk", SG_ERROR_GETMNTINFO, "GetLogicalDriveStrings"); } buf = malloc(dynbuflen); if( NULL == buf ) { RETURN_WITH_SET_ERROR("disk", SG_ERROR_MALLOC, "GetLogicalDriveStrings"); } dynbuflen = GetLogicalDriveStrings(dynbuflen, buf); if( 0 == dynbuflen ) { free(buf); RETURN_WITH_SET_ERROR("disk", SG_ERROR_GETMNTINFO, "GetLogicalDriveStrings"); } if (!(GetLogicalDriveStrings(BUFSIZE-1, lp_buf))) { RETURN_WITH_SET_ERROR("disk", SG_ERROR_GETMNTINFO, "GetLogicalDriveStrings"); } SetLastError(0); #define NEED_VECTOR_UPDATE #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP free(buf); #define SG_FS_LOOP_INIT p = buf, rc = getdrvent(p, (1 << DRIVE_FIXED)|(1<mnt_point, &fs ) != 0 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO( "disk", SG_ERROR_DISKINFO, "statvfs64 for mnt_point at %s (device: %s, fs_type: %s)", fs_stats_ptr->mnt_point, fs_stats_ptr->device_name, fs_stats_ptr->fs_type ); } fs_stats_ptr->total_inodes = fs.f_files; fs_stats_ptr->free_inodes = fs.f_ffree; fs_stats_ptr->avail_inodes = fs.f_favail; fs_stats_ptr->used_inodes = fs_stats_ptr->total_inodes - fs_stats_ptr->free_inodes; #if defined(HAVE_STATVFS_FIOSIZE) fs_stats_ptr->io_size = fs.f_iosize; #else fs_stats_ptr->io_size = fs.f_bsize; #endif #if defined(HAVE_STATVFS_FFRSIZE) fs_stats_ptr->block_size = fs.f_frsize; #else fs_stats_ptr->block_size = fs.f_bsize; #endif fs_stats_ptr->total_blocks = fs.f_blocks; fs_stats_ptr->free_blocks = fs.f_bfree; fs_stats_ptr->avail_blocks = fs.f_bavail; fs_stats_ptr->used_blocks = fs_stats_ptr->total_blocks - fs_stats_ptr->free_blocks; #elif defined(HAVE_STATVFS) && defined(HAVE_STRUCT_STATVFS) memset( &fs, 0, sizeof(fs) ); if( statvfs( fs_stats_ptr->mnt_point, &fs ) != 0 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO( "disk", SG_ERROR_DISKINFO, "statvfs for mnt_point at %s (device: %s, fs_type: %s)", fs_stats_ptr->mnt_point, fs_stats_ptr->device_name, fs_stats_ptr->fs_type ); } fs_stats_ptr->total_inodes = fs.f_files; fs_stats_ptr->free_inodes = fs.f_ffree; fs_stats_ptr->avail_inodes = fs.f_favail; fs_stats_ptr->used_inodes = fs_stats_ptr->total_inodes - fs_stats_ptr->free_inodes; #if defined(HAVE_STATVFS_FIOSIZE) fs_stats_ptr->io_size = fs.f_iosize; #else fs_stats_ptr->io_size = fs.f_bsize; #endif #if defined(HAVE_STATVFS_FFRSIZE) fs_stats_ptr->block_size = fs.f_frsize; #else fs_stats_ptr->block_size = fs.f_bsize; #endif fs_stats_ptr->total_blocks = fs.f_blocks; fs_stats_ptr->free_blocks = fs.f_bfree; fs_stats_ptr->avail_blocks = fs.f_bavail; fs_stats_ptr->used_blocks = fs_stats_ptr->total_blocks - fs_stats_ptr->free_blocks; #elif defined(HAVE_STATFS) && defined(HAVE_STRUCT_STATFS) memset( &fs, 0, sizeof(fs) ); if( statfs( fs_stats_ptr->mnt_point, &fs ) != 0 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO( "disk", SG_ERROR_DISKINFO, "statfs for mnt_point at %s (device: %s, fs_type: %s)", fs_stats_ptr->mnt_point, fs_stats_ptr->device_name, fs_stats_ptr->fs_type ); } fs_stats_ptr->total_inodes = fs.f_files; fs_stats_ptr->free_inodes = fs.f_ffree; #ifdef HAVE_STATFS_FFAVAIL fs_stats_ptr->avail_inodes = fs.f_favail; #else fs_stats_ptr->avail_inodes = #endif fs_stats_ptr->used_inodes = fs_stats_ptr->total_inodes - fs_stats_ptr->free_inodes; #if defined(HAVE_STATFS_FIOSIZE) fs_stats_ptr->io_size = fs.f_iosize; #elif defined(HAVE_STATFS_FFRSIZE) fs_stats_ptr->io_size = fs.f_frsize; #else fs_stats_ptr->io_size = fs.f_bsize; #endif /* no system found which implements behavior like statvfs * f_bsize vs. f_frsize but has no statvfs */ fs_stats_ptr->block_size = fs.f_bsize; fs_stats_ptr->total_blocks = fs.f_blocks; fs_stats_ptr->free_blocks = fs.f_bfree; fs_stats_ptr->avail_blocks = fs.f_bavail; fs_stats_ptr->used_blocks = fs_stats_ptr->total_blocks - fs_stats_ptr->free_blocks; #elif defined(WIN32) if( GetDiskFreeSpace( fs_stats_ptr->mnt_point, §ors_per_cluster, &bytes_per_sector, &free_clusters, &total_clusters ) == 0 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO( "disk", SG_ERROR_DISKINFO, "GetDiskFreeSpace for %s", fs_stats_ptr->mnt_point ); } fs_stats_ptr->total_inodes = 0; fs_stats_ptr->free_inodes = 0; fs_stats_ptr->avail_inodes = 0; fs_stats_ptr->used_inodes = 0; fs_stats_ptr->io_size = fs_stats_ptr->block_size = ((long long)sectors_per_cluster) * bytes_per_sector; fs_stats_ptr->total_blocks = fs_stats_ptr->block_size * total_clusters; fs_stats_ptr->free_blocks = (long long)free_clusters; fs_stats_ptr->avail_blocks = fs_stats_ptr->used_blocks = fs_stats_ptr->total_block - fs_stats_ptr->free_blocks; #else RETURN_WITH_SET_ERROR("disk", SG_ERROR_UNSUPPORTED, OS_TYPE); #define UNSUPPORTED #endif #ifndef UNSUPPORTED fs_stats_ptr->size = fs_stats_ptr->block_size * fs_stats_ptr->total_blocks; fs_stats_ptr->avail = fs_stats_ptr->block_size * fs_stats_ptr->avail_blocks; fs_stats_ptr->free = fs_stats_ptr->block_size * fs_stats_ptr->free_blocks; fs_stats_ptr->used = fs_stats_ptr->block_size * fs_stats_ptr->used_blocks; fs_stats_ptr->systime = time(NULL); return SG_ERROR_NONE; #endif } static sg_error sg_get_fs_stats_int(sg_vector **fs_stats_vector_ptr){ sg_vector *tmp = NULL; sg_error err = sg_get_fs_list_int(&tmp); size_t i, j, n = 0; sg_fs_stats *items, *item = VECTOR_DATA(tmp); unsigned valid[(VECTOR_ITEM_COUNT(tmp) / (8 * sizeof(unsigned))) + 1]; memset( valid, 0, sizeof(valid) ); if( ( SG_ERROR_NONE == err ) && (NULL != tmp) ) { i = VECTOR_ITEM_COUNT(tmp); item += i; while( i ) { --i; --item; if( is_valid_fs_type(item->fs_type) ) { if( SG_ERROR_NONE != sg_fill_fs_stat_int(item) ) continue; BIT_SET(valid, i); ++n; } } } #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP VECTOR_UPDATE(fs_stats_vector_ptr, n, items, sg_fs_stats); /* both assignment should be useless, because they should already on these values */ i = 0; item = VECTOR_DATA(tmp); for( j = 0; j < n; ++j, ++i ) { BIT_SCAN_FWD(valid, i); if( i >= VECTOR_ITEM_COUNT(tmp) ) /* shouldn't happen ?! */ break; sg_fs_stats_item_copy(item+i, items+j); } /* XXX shouldn't fail !? */ assert( j == n ); sg_vector_free(tmp); return err; } MULTI_COMP_ACCESS(sg_get_fs_stats,disk,fs,SG_FS_STAT_NOW_IDX) MULTI_COMP_DIFF(sg_get_fs_stats_diff,sg_get_fs_stats,disk,fs,SG_FS_STAT_DIFF_IDX,SG_FS_STAT_NOW_IDX) int sg_fs_compare_device_name(const void *va, const void *vb) { const sg_fs_stats *a = va, *b = vb; return strcmp(a->device_name, b->device_name); } int sg_fs_compare_mnt_point(const void *va, const void *vb) { const sg_fs_stats *a = va, *b = vb; return strcmp(a->mnt_point, b->mnt_point); } #if 0 #ifdef LINUX typedef struct { int major; int minor; } partition; #endif #endif #ifdef HPUX static const char *disk_devs_in[] = { "/dev/dsk", "/dev/disk" }; #endif static sg_error sg_get_disk_io_stats_int( sg_vector **disk_io_stats_vector_ptr ) { size_t num_diskio = 0; sg_disk_io_stats *disk_io_stats; time_t now = time(NULL); #ifdef HPUX long long rbytes = 0, wbytes = 0; struct stat lstatinfo; #define DISK_BATCH 30 struct pst_diskinfo pstat_diskinfo[DISK_BATCH]; char fullpathbuf[1024] = {0}; dev_t diskid; struct dirent *dinfo; size_t dinfo_size = sizeof(*dinfo) - sizeof(dinfo->d_name) + PATH_MAX + 1; int diskidx = 0; int num, i; size_t n; #elif defined(SOLARIS) kstat_ctl_t *kc; kstat_t *ksp; kstat_io_t kios; #elif defined(DARWIN) io_iterator_t drivelist; io_registry_entry_t drive; CFMutableDictionaryRef match; kern_return_t status; #elif defined(LINUX) FILE *f; #define LINE_BUF_SIZE 256 char line_buf[LINE_BUF_SIZE]; #if 0 int has_pp_stats = 1; #endif const char *format; #elif defined(HAVE_STRUCT_IO_SYSCTL) || defined(HAVE_STRUCT_DISKSTATS) || defined(HAVE_STRUCT_DISK_SYSCTL) int num_disks, i; size_t size; # if defined(HAVE_STRUCT_IO_SYSCTL) int mib[3] = { CTL_HW, HW_IOSTATS, sizeof(struct io_sysctl) }; # define STATS_TYPE struct io_sysctl # define STATS_NAME(s) (s.name) # define STATS_RBYTES(s) (s.rbytes) # define STATS_WBYTES(s) (s.wbytes) # elif defined(HAVE_STRUCT_DISK_SYSCTL) int mib[3] = { CTL_HW, HW_DISKSTATS, sizeof(struct disk_sysctl) }; # define STATS_TYPE struct disk_sysctl # define STATS_NAME(s) (s.dk_name) # if defined(HAVE_DK_RBYTES) # define STATS_RBYTES(s) (s.dk_rbytes) # define STATS_WBYTES(s) (s.dk_wbytes) # else # define STATS_RBYTES(s) (s.dk_bytes) # define STATS_WBYTES(s) (s.dk_bytes) # endif # else int mib[2] = { CTL_HW, HW_DISKSTATS }; # define STATS_TYPE struct diskstats # define STATS_NAME(s) (s.ds_name) # if defined(HAVE_DISKSTAT_DS_RBYTES) # define STATS_RBYTES(s) (s.ds_rbytes) # define STATS_WBYTES(s) (s.ds_wbytes) # else # define STATS_RBYTES(s) (s.ds_bytes) # define STATS_WBYTES(s) (s.ds_bytes) # endif # endif STATS_TYPE *stats; #elif defined(HAVE_STRUCT_DEVSTAT) && defined(HAVE_STRUCT_STATINFO) struct statinfo stats; int counter; #if 0 struct device_selection *dev_sel = NULL; int n_selected, n_selections; long sel_gen; #endif struct devstat *dev_ptr; #elif defined(AIX) ssize_t ret, disks; perfstat_disk_t *dskperf; perfstat_id_t name; #elif defined(WIN32) char *name; long long rbytes; long long wbytes; #endif assert(disk_io_stats_vector_ptr); if( NULL == disk_io_stats_vector_ptr || NULL == *disk_io_stats_vector_ptr ) { RETURN_WITH_SET_ERROR("disk", SG_ERROR_INVALID_ARGUMENT, "disk_io_stats_vector_ptr"); } #ifdef AIX #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP free(dskperf); /* check how many perfstat_disk_t structures are available */ disks = perfstat_disk(NULL, NULL, sizeof(perfstat_disk_t), 0); if( disks == -1 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", SG_ERROR_PSTAT, "perfstat_disk(NULL)"); } dskperf = malloc( sizeof(perfstat_disk_t) * disks ); if( 0 == dskperf ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", SG_ERROR_MALLOC, "sg_get_disk_io_stats"); } name.name[0] = 0; ret = perfstat_disk(&name, dskperf, sizeof(perfstat_disk_t), disks); if( ret == -1 ) { free(dskperf); RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", SG_ERROR_PSTAT, "perfstat_disk"); } VECTOR_UPDATE(disk_io_stats_vector_ptr, (size_t)ret, disk_io_stats, sg_disk_io_stats); for( num_diskio = 0; num_diskio < (size_t)ret; ++num_diskio ) { disk_io_stats[num_diskio].read_bytes = dskperf[num_diskio].bsize * dskperf[num_diskio].rblks; disk_io_stats[num_diskio].write_bytes = dskperf[num_diskio].bsize * dskperf[num_diskio].wblks; disk_io_stats[num_diskio].systime = now; if( disk_io_stats[num_diskio].disk_name == NULL ) { unsigned i; for( i = 0; i < IDENTIFIER_LENGTH; ++i ) { char *s = dskperf[num_diskio].name + i; int ch = (unsigned)(*s); if( !(isalpha(ch) || isdigit(ch) || *s == '-' || *s == '_' || *s == ' ') ) { *s = 0; break; } } if( sg_update_string(&disk_io_stats[num_diskio].disk_name, dskperf[num_diskio].name) != SG_ERROR_NONE ) { VECTOR_UPDATE_ERROR_CLEANUP; RETURN_FROM_PREVIOUS_ERROR( "disk", sg_get_error() ); } } } free(dskperf); #elif defined(DARWIN) /* * following code is partially taken from XNU and Darwin Sources provided via * http://www.opensource.apple.com/source/system_cmds/system_cmds-336/ * and other parts from Hyperion-Sigar. */ #define IoStatGetIntValue(src, key, val) \ do { \ CFNumberRef number; \ if ((number = (CFNumberRef)CFDictionaryGetValue(src, CFSTR(key)))) \ CFNumberGetValue(number, kCFNumberSInt64Type, &(val)); \ } while(0) #define IoStatGetStringValue(src, key, val) \ do { \ CFStringRef name = (CFStringRef)CFDictionaryGetValue(src, CFSTR(key)); \ if(name) { \ const char *valbp = CFStringGetCStringPtr(name, CFStringGetSystemEncoding()); \ sg_error errc; \ if(NULL == valbp) { char valbuf[PATH_MAX]; \ CFStringGetCString(name, valbuf, sizeof(valbuf), CFStringGetSystemEncoding()); \ errc = sg_update_string(&(val), valbuf); \ } \ else \ errc = sg_update_string(&(val), valbp); \ if( errc != SG_ERROR_NONE ) { \ VECTOR_UPDATE_ERROR_CLEANUP; \ RETURN_FROM_PREVIOUS_ERROR( "disk", sg_get_error() ); \ } \ } \ } while(0) /* * Get an iterator for IOMedia objects. */ match = IOServiceMatching("IOMedia"); CFDictionaryAddValue(match, CFSTR(kIOMediaWholeKey), kCFBooleanTrue); status = IOServiceGetMatchingServices(masterPort, match, &drivelist); if (status != KERN_SUCCESS) { RETURN_WITH_SET_ERROR_WITH_ERRNO_CODE("disk", SG_ERROR_IOKIT, status, "couldn't match whole IOMedia devices"); } /* * Scan all of the IOMedia objects, and for each * object that has a parent IOBlockStorageDriver, save * the object's name and the parent (from which we can * fetch statistics). * * XXX What about RAID devices? */ while( (drive = IOIteratorNext(drivelist)) ) { #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP IOObjectRelease(drive); IOObjectRelease(parent); io_registry_entry_t parent; /* get drive's parent */ status = IORegistryEntryGetParentEntry(drive, kIOServicePlane, &parent); if (status != KERN_SUCCESS) { RETURN_WITH_SET_ERROR_WITH_ERRNO_CODE("disk", SG_ERROR_IOKIT, status, "device has no parent"); } if (IOObjectConformsTo(parent, "IOBlockStorageDriver")) { CFDictionaryRef properties; CFDictionaryRef stats; VECTOR_UPDATE(disk_io_stats_vector_ptr, num_diskio + 1, disk_io_stats, sg_disk_io_stats); /* get drive properties */ status = IORegistryEntryCreateCFProperties(drive, (CFMutableDictionaryRef *)&properties, kCFAllocatorDefault, kNilOptions); if (status != KERN_SUCCESS) { IOObjectRelease(parent); IOObjectRelease(drive); CFRelease(properties); RETURN_WITH_SET_ERROR_WITH_ERRNO_CODE("disk", SG_ERROR_IOKIT, status, "device has no properties"); } /* * > kIOMediaPreferredBlockSizeKey * > kIOBSDNameKey * > kIOBlockStorageDriverStatisticsReadsKey * > kIOBlockStorageDriverStatisticsBytesReadKey * > kIOBlockStorageDriverStatisticsTotalReadTimeKey * > kIOBlockStorageDriverStatisticsWritesKey * > kIOBlockStorageDriverStatisticsBytesWrittenKey * > kIOBlockStorageDriverStatisticsTotalWriteTimeKey */ IoStatGetStringValue(properties, kIOBSDNameKey, disk_io_stats[num_diskio].disk_name); CFRelease(properties); status = IORegistryEntryCreateCFProperties(parent, (CFMutableDictionaryRef *)&properties, kCFAllocatorDefault, kNilOptions); if (status != KERN_SUCCESS) { IOObjectRelease(parent); IOObjectRelease(drive); CFRelease(properties); RETURN_WITH_SET_ERROR_WITH_ERRNO_CODE("disk", SG_ERROR_IOKIT, status, "parent has no properties"); } stats = (CFDictionaryRef)CFDictionaryGetValue(properties, CFSTR(kIOBlockStorageDriverStatisticsKey)); if(stats) { IoStatGetIntValue(stats, kIOBlockStorageDriverStatisticsBytesReadKey, disk_io_stats[num_diskio].read_bytes); IoStatGetIntValue(stats, kIOBlockStorageDriverStatisticsBytesWrittenKey, disk_io_stats[num_diskio].write_bytes); } disk_io_stats[num_diskio].systime = now; /* clean up, return success */ CFRelease(properties); ++num_diskio; } IOObjectRelease(parent); IOObjectRelease(drive); #undef VECTOR_UPDATE_ERROR_CLEANUP } IOObjectRelease(drivelist); #elif defined(HPUX) for(;;) { size_t enabled_disks = 0; num = pstat_getdisk(pstat_diskinfo, sizeof pstat_diskinfo[0], DISK_BATCH, diskidx); if( num == -1 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", SG_ERROR_PSTAT, "pstat_getdisk(idx=%d)", diskidx); } else if (num == 0 ) { break; } for( i = 0; i < num; ++i ) { struct pst_diskinfo *di = &pstat_diskinfo[i]; /* Skip "disabled" disks. */ if( di->psd_status == 0 ) { continue; } ++enabled_disks; } VECTOR_UPDATE(disk_io_stats_vector_ptr, num_diskio + enabled_disks, disk_io_stats, sg_disk_io_stats); dinfo = calloc(1, dinfo_size); if( NULL == dinfo ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", SG_ERROR_MALLOC, "calloc for readdir_r()"); } for( i = 0; i < num; ++i ) { struct pst_diskinfo *di = &pstat_diskinfo[i]; /* Skip "disabled" disks. */ if( di->psd_status == 0 ) { continue; } #ifdef HAVE_PST_DISKINFO_PSD_DKBYTEWRITE rbytes = di->psd_dkbyteread; wbytes = di->psd_dkbytewrite; #else /* We can't seperate the reads from the writes, we'll * just give the same to each. (This value is in * 64-byte chunks according to the pstat header file, * and can wrap to be negative.) */ rbytes = wbytes = ((long long) di->psd_dkwds) * 64LL; #endif disk_io_stats[num_diskio].read_bytes = rbytes; disk_io_stats[num_diskio].write_bytes = wbytes; disk_io_stats[num_diskio].systime = now; /* FIXME This should use a static cache, like the Linux * code below. */ diskid = (di->psd_dev.psd_major << 24) | di->psd_dev.psd_minor; for( n = 0; n < lengthof(disk_devs_in); ++n ) { struct dirent *result = NULL; DIR *dh = opendir(disk_devs_in[n]); if( dh == NULL ) { continue; } while( ( 0 == (readdir_r(dh, dinfo, &result)) ) && ( result != NULL ) ) { snprintf(fullpathbuf, sizeof(fullpathbuf), "%s/%s", disk_devs_in[n], dinfo->d_name); if( lstat(fullpathbuf, &lstatinfo) < 0 ) { continue; } if( lstatinfo.st_rdev == diskid ) { if( sg_update_string(&disk_io_stats[num_diskio].disk_name, dinfo->d_name) != SG_ERROR_NONE ) { RETURN_FROM_PREVIOUS_ERROR( "disk", sg_get_error() ); } break; } } closedir(dh); } if( disk_io_stats[num_diskio].disk_name == NULL ) { if( sg_update_string(&disk_io_stats[num_diskio].disk_name, di->psd_hw_path.psh_name) != SG_ERROR_NONE ) { RETURN_FROM_PREVIOUS_ERROR( "disk", sg_get_error() ); } } ++num_diskio; } free(dinfo); if(pstat_diskinfo[num - 1].psd_idx >= INT_MAX) { RETURN_WITH_SET_ERROR("disk", SG_ERROR_PSTAT, "pstat_getdisk(idx=%ld >= INT_MAX)", pstat_diskinfo[num - 1].psd_idx); } diskidx = (int)((pstat_diskinfo[num - 1].psd_idx + 1) % INT_MAX); } #elif defined(HAVE_STRUCT_IO_SYSCTL) || defined(HAVE_STRUCT_DISKSTATS) || defined(HAVE_STRUCT_DISK_SYSCTL) if( sysctl(mib, lengthof(mib), NULL, &size, NULL, 0) < 0 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", SG_ERROR_SYSCTL, "CTL_HW.HW_DISKSTATS"); } num_disks = size / sizeof(STATS_TYPE); stats = sg_malloc(size); if( stats == NULL ) { RETURN_FROM_PREVIOUS_ERROR( "disk", sg_get_error() ); } #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP free(stats); if( sysctl(mib, lengthof(mib), stats, &size, NULL, 0) < 0 ) { VECTOR_UPDATE_ERROR_CLEANUP; RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", SG_ERROR_SYSCTL, "CTL_HW.HW_DISKSTATS"); } VECTOR_UPDATE(disk_io_stats_vector_ptr, num_disks, disk_io_stats, sg_disk_io_stats); for( i = 0; i < num_disks; ++i ) { #if 0 /* Don't keep stats for disks that have never been used. FIXME: Why? */ if (rbytes == 0 && wbytes == 0) { continue; } #endif disk_io_stats[num_diskio].read_bytes = STATS_RBYTES(stats[i]); disk_io_stats[num_diskio].write_bytes = STATS_WBYTES(stats[i]); if( sg_update_string(&disk_io_stats[num_diskio].disk_name, STATS_NAME(stats[i])) != SG_ERROR_NONE ) { VECTOR_UPDATE_ERROR_CLEANUP; RETURN_FROM_PREVIOUS_ERROR( "disk", sg_get_error() ); } disk_io_stats[num_diskio].systime = now; ++num_diskio; } free(stats); #elif defined(HAVE_STRUCT_DEVSTAT) && defined(HAVE_STRUCT_STATINFO) stats.dinfo = sg_malloc(sizeof(struct devinfo)); if( stats.dinfo == NULL ) { RETURN_FROM_PREVIOUS_ERROR( "disk", sg_get_error() ); } bzero( stats.dinfo, sizeof(struct devinfo) ); # if HAVE_DEVSTAT_GETDEVS # define GETDEVS_FN(target) devstat_getdevs(NULL, target) # define GETDEVS_FN_NAME "devstat_getdevs" # else # define GETDEVS_FN(target) getdevs(target) # define GETDEVS_FN_NAME "getdevs" # endif #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP free(stats.dinfo->mem_ptr); free(stats.dinfo); if( GETDEVS_FN( &stats) < 0 ) { VECTOR_UPDATE_ERROR_CLEANUP; RETURN_WITH_SET_ERROR("disk", SG_ERROR_DEVSTAT_GETDEVS, GETDEVS_FN_NAME ); } for( counter = 0; counter < stats.dinfo->numdevs; ++counter ) { dev_ptr = &stats.dinfo->devices[counter]; /* care only for disk-like block-devices */ if( ( DEVSTAT_TYPE_DIRECT != (dev_ptr->device_type & DEVSTAT_TYPE_MASK) ) && ( DEVSTAT_TYPE_SEQUENTIAL != (dev_ptr->device_type & DEVSTAT_TYPE_MASK) ) && ( DEVSTAT_TYPE_WORM != (dev_ptr->device_type & DEVSTAT_TYPE_MASK) ) && ( DEVSTAT_TYPE_CDROM != (dev_ptr->device_type & DEVSTAT_TYPE_MASK) ) && ( DEVSTAT_TYPE_OPTICAL != (dev_ptr->device_type & DEVSTAT_TYPE_MASK) ) && ( DEVSTAT_TYPE_CHANGER != (dev_ptr->device_type & DEVSTAT_TYPE_MASK) ) && ( DEVSTAT_TYPE_STORARRAY != (dev_ptr->device_type & DEVSTAT_TYPE_MASK) ) && ( DEVSTAT_TYPE_FLOPPY != (dev_ptr->device_type & DEVSTAT_TYPE_MASK) ) ) continue; ++num_diskio; } VECTOR_UPDATE(disk_io_stats_vector_ptr, num_diskio, disk_io_stats, sg_disk_io_stats); for( num_diskio = 0, counter = 0; counter < stats.dinfo->numdevs; ++counter ) { dev_ptr = &stats.dinfo->devices[counter]; /* care only for disk-like block-devices */ if( ( DEVSTAT_TYPE_DIRECT != (dev_ptr->device_type & DEVSTAT_TYPE_MASK) ) && ( DEVSTAT_TYPE_SEQUENTIAL != (dev_ptr->device_type & DEVSTAT_TYPE_MASK) ) && ( DEVSTAT_TYPE_WORM != (dev_ptr->device_type & DEVSTAT_TYPE_MASK) ) && ( DEVSTAT_TYPE_CDROM != (dev_ptr->device_type & DEVSTAT_TYPE_MASK) ) && ( DEVSTAT_TYPE_OPTICAL != (dev_ptr->device_type & DEVSTAT_TYPE_MASK) ) && ( DEVSTAT_TYPE_CHANGER != (dev_ptr->device_type & DEVSTAT_TYPE_MASK) ) && ( DEVSTAT_TYPE_STORARRAY != (dev_ptr->device_type & DEVSTAT_TYPE_MASK) ) && ( DEVSTAT_TYPE_FLOPPY != (dev_ptr->device_type & DEVSTAT_TYPE_MASK) ) ) continue; #if defined(HAVE_DEVSTAT_BYTES) disk_io_stats[num_diskio].read_bytes=dev_ptr->bytes[DEVSTAT_READ]; disk_io_stats[num_diskio].write_bytes=dev_ptr->bytes[DEVSTAT_WRITE]; #elif defined(HAVE_DEVSTAT_BYTES_READ) disk_io_stats[num_diskio].read_bytes=dev_ptr->bytes_read; disk_io_stats[num_diskio].write_bytes=dev_ptr->bytes_written; #endif if( disk_io_stats[num_diskio].disk_name != NULL ) { free(disk_io_stats[num_diskio].disk_name); disk_io_stats[num_diskio].disk_name = 0; } if( asprintf( &disk_io_stats[num_diskio].disk_name, "%s%d", dev_ptr->device_name, dev_ptr->unit_number ) == -1 ) { VECTOR_UPDATE_ERROR_CLEANUP; RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", SG_ERROR_ASPRINTF, NULL); } disk_io_stats[num_diskio].systime = now; ++num_diskio; } free(stats.dinfo->mem_ptr); free(stats.dinfo); #elif defined(SOLARIS) if( (kc = kstat_open()) == NULL ) { RETURN_WITH_SET_ERROR("disk", SG_ERROR_KSTAT_OPEN, NULL); } #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP kstat_close(kc); for( ksp = kc->kc_chain; ksp; ksp = ksp->ks_next ) { if( !strcmp(ksp->ks_class, "disk") ) { if( ksp->ks_type != KSTAT_TYPE_IO ) continue; /* We dont want metadevices appearins as num_diskio */ if( strcmp( ksp->ks_module, "md" ) == 0 ) continue; if( ( kstat_read(kc, ksp, &kios) ) == -1 ) { /* XXX intentional? */ kstat_close(kc); RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", SG_ERROR_KSTAT_READ, NULL); } VECTOR_UPDATE(disk_io_stats_vector_ptr, num_diskio + 1, disk_io_stats, sg_disk_io_stats); disk_io_stats[num_diskio].read_bytes = kios.nread; disk_io_stats[num_diskio].write_bytes = kios.nwritten; if( sg_update_string(&disk_io_stats[num_diskio].disk_name, sg_get_svr_from_bsd(ksp->ks_name)) != SG_ERROR_NONE ) { kstat_close(kc); RETURN_FROM_PREVIOUS_ERROR( "disk", sg_get_error() ); } disk_io_stats[num_diskio].systime = now; ++num_diskio; } } #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP kstat_close(kc); #elif defined(LINUX) num_diskio = 0; /* Read /proc/partitions to find what devices exist. Recent 2.4 kernels have statistics in here too, so we can use those directly. 2.6 kernels have /proc/diskstats instead with almost (but not quite) the same format. */ f = fopen("/proc/diskstats", "r"); format = " %*d %*d %99s %*d %*d %llu %*d %*d %*d %llu"; #if 0 if (f == NULL) { f = fopen("/proc/partitions", "r"); format = " %d %d %*d %99s %*d %*d %lld %*d %*d %*d %lld"; } #endif if( f == NULL ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("disk", SG_ERROR_OPEN, "/proc/diskstats"); } #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP fclose(f); while( fgets(line_buf, sizeof(line_buf), f) != NULL ) { char name[100]; unsigned long long rsect, wsect; int nr = sscanf(line_buf, format, name, &rsect, &wsect); if( nr != 3 ) continue; #if 0 /* Skip device names ending in numbers, since they're partitions, unless they match the c0d0 pattern that some RAID devices use. */ /* FIXME: For 2.6+, we should probably be using sysfs to detect this... */ /* loopN, dm-NN, ramNm ... shouldn't be skipped, neither partitions should in times of soft-raid via lvm or varying i/o load on partitions */ if ((regexec(&part_re, name, 0, NULL, 0) == 0) && (regexec(¬_part_re, name, 0, NULL, 0) != 0)) { continue; } #endif #if 0 /* Linux 2.4 is unsupported until someone ports back ...*/ if (nr < 5) { has_pp_stats = 0; rsect = 0; wsect = 0; } #endif VECTOR_UPDATE(disk_io_stats_vector_ptr, num_diskio + 1, disk_io_stats, sg_disk_io_stats); if( sg_update_string(&disk_io_stats[num_diskio].disk_name, name) != SG_ERROR_NONE ) { fclose(f); RETURN_FROM_PREVIOUS_ERROR( "disk", sg_get_error() ); } disk_io_stats[num_diskio].read_bytes = rsect * 512; disk_io_stats[num_diskio].write_bytes = wsect * 512; disk_io_stats[num_diskio].systime = now; #if 0 parts[n].major = major; parts[n].minor = minor; #endif ++num_diskio; } #undef VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE_ERROR_CLEANUP fclose(f); #if 0 f = NULL; if (!has_pp_stats) { /* This is an older kernel where /proc/partitions doesn't contain stats. Read what we can from /proc/stat instead, and fill in the appropriate bits of the list allocated above. */ f = fopen("/proc/stat", "r"); if (f == NULL) goto out; now = time(NULL); line_ptr = sg_f_read_line(f, "disk_io:"); if (line_ptr == NULL) goto out; while((line_ptr=strchr(line_ptr, ' '))!=NULL){ long long rsect, wsect; if (*++line_ptr == '\0') break; if((sscanf(line_ptr, "(%d,%d):(%*d, %*d, %lld, %*d, %lld)", &major, &minor, &rsect, &wsect)) != 4) { continue; } /* Find the corresponding device from earlier. Just to add to the fun, "minor" is actually the disk number, not the device minor, so we need to figure out the real minor number based on the major! This list is not exhaustive; if you're running an older kernel you probably don't have fancy I2O hardware anyway... */ switch (major) { case 3: case 21: case 22: case 33: case 34: case 36: case 56: case 57: case 88: case 89: case 90: case 91: minor *= 64; break; case 9: case 43: break; default: minor *= 16; break; } for (i = 0; i < n; i++) { if (major == parts[i].major && minor == parts[i].minor) break; } if (i == n) continue; /* We read the number of blocks. Blocks are stored in 512 bytes */ disk_io_stats[i].read_bytes = rsect * 512; disk_io_stats[i].write_bytes = wsect * 512; disk_io_stats[i].systime = now; } } #endif #elif defined(WIN32) sg_clear_error(); while( ( name = get_diskio(num_diskio, &rbytes, &wbytes) ) != NULL ) { VECTOR_UPDATE(disk_io_stats_vector_ptr, num_diskio + 1, disk_io_stats, sg_disk_io_stats); if( sg_update_string(&disk_io_stats[num_diskio].disk_name, name) != SG_ERROR_NONE ) { RETURN_FROM_PREVIOUS_ERROR( "disk", sg_get_error() ); } sg_update_string(&name, NULL); disk_io_stats[num_diskio].read_bytes = rbytes; disk_io_stats[num_diskio].write_bytes = wbytes; disk_io_stats[num_diskio].systime = 0; ++num_diskio; } #else RETURN_WITH_SET_ERROR("disk", SG_ERROR_UNSUPPORTED, OS_TYPE); #endif return SG_ERROR_NONE; } MULTI_COMP_ACCESS(sg_get_disk_io_stats,disk,disk_io,SG_DISK_IO_NOW_IDX) MULTI_COMP_DIFF(sg_get_disk_io_stats_diff,sg_get_disk_io_stats,disk,disk_io,SG_DISK_IO_DIFF_IDX,SG_DISK_IO_NOW_IDX) int sg_disk_io_compare_name(const void *va, const void *vb) { const sg_disk_io_stats *a = va, *b = vb; return strcmp(a->disk_name, b->disk_name); } int sg_disk_io_compare_traffic(const void *va, const void *vb) { const sg_disk_io_stats *a = va, *b = vb; unsigned long long tot_a = a->read_bytes + a->write_bytes; unsigned long long tot_b = b->read_bytes + b->write_bytes; return (tot_a == tot_b) ? 0 : (tot_a > tot_b) ? -1 : 1; /* XXX reverse order! */ } libstatgrab-0.90/src/libstatgrab/statgrab.h000644 001750 001750 00000033656 12200045555 020774 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #ifndef STATGRAB_H #define STATGRAB_H #ifdef __cplusplus extern "C" { #endif #include #include #if 0 #define __sg_export #define __sg_import #define __sg_private #else #define __sg_export #define __sg_import #define __sg_private #endif #ifdef BUILD_LIBSTATGRAB #define __sg_public __sg_export #else #define __sg_public __sg_import #endif /* FIXME typedefs for 32/64-bit types */ /* FIXME maybe tidy up field names? */ /* FIXME comments for less obvious fields */ typedef enum { SG_ERROR_NONE = 0, SG_ERROR_INVALID_ARGUMENT, SG_ERROR_ASPRINTF, SG_ERROR_SPRINTF, SG_ERROR_DEVICES, SG_ERROR_DEVSTAT_GETDEVS, SG_ERROR_DEVSTAT_SELECTDEVS, SG_ERROR_DISKINFO, SG_ERROR_ENOENT, SG_ERROR_GETIFADDRS, SG_ERROR_GETMNTINFO, SG_ERROR_GETPAGESIZE, SG_ERROR_HOST, SG_ERROR_KSTAT_DATA_LOOKUP, SG_ERROR_KSTAT_LOOKUP, SG_ERROR_KSTAT_OPEN, SG_ERROR_KSTAT_READ, SG_ERROR_KVM_GETSWAPINFO, SG_ERROR_KVM_OPENFILES, SG_ERROR_MALLOC, SG_ERROR_MEMSTATUS, SG_ERROR_OPEN, SG_ERROR_OPENDIR, SG_ERROR_READDIR, SG_ERROR_PARSE, SG_ERROR_PDHADD, SG_ERROR_PDHCOLLECT, SG_ERROR_PDHOPEN, SG_ERROR_PDHREAD, SG_ERROR_PERMISSION, SG_ERROR_PSTAT, SG_ERROR_SETEGID, SG_ERROR_SETEUID, SG_ERROR_SETMNTENT, SG_ERROR_SOCKET, SG_ERROR_SWAPCTL, SG_ERROR_SYSCONF, SG_ERROR_SYSCTL, SG_ERROR_SYSCTLBYNAME, SG_ERROR_SYSCTLNAMETOMIB, SG_ERROR_SYSINFO, SG_ERROR_MACHCALL, SG_ERROR_IOKIT, SG_ERROR_UNAME, SG_ERROR_UNSUPPORTED, SG_ERROR_XSW_VER_MISMATCH, SG_ERROR_GETMSG, SG_ERROR_PUTMSG, SG_ERROR_INITIALISATION, SG_ERROR_MUTEX_LOCK, SG_ERROR_MUTEX_UNLOCK } sg_error; typedef struct sg_error_details { sg_error error; int errno_value; const char *error_arg; } sg_error_details; __sg_public sg_error sg_get_error(void); __sg_public const char *sg_get_error_arg(void); __sg_public int sg_get_error_errno(void); __sg_public sg_error sg_get_error_details(sg_error_details *err_details); __sg_public const char * sg_str_error(sg_error code); __sg_public char *sg_strperror(char **buf, const sg_error_details * const err_details); /* * initializes libstatgrab * @param ignore_init_errors - set to a true value to ignore initialization * errors of component initializations (e.g. permission problems for kvm * on freebsd) * XXX requires each component to provide a get__init_error() and a * reinit_() */ __sg_public sg_error sg_init(int ignore_init_errors); __sg_public sg_error sg_snapshot(void); __sg_public sg_error sg_shutdown(void); __sg_public sg_error sg_drop_privileges(void); __sg_public size_t sg_get_nelements(const void *data); __sg_public sg_error sg_free_stats_buf(void *data); #if 1 #define SG_SUPPORT_THREADS __sg_public sg_error sg_lock_mutex(const char *mutex_name); __sg_public sg_error sg_unlock_mutex(const char *mutex_name); #else #define sg_lock_mutex(name) SG_ERROR_NONE #define sg_unlock_mutex(name) SG_ERROR_NONE #endif typedef enum { sg_unknown_configuration = 0, sg_physical_host, sg_virtual_machine, sg_paravirtual_machine, sg_hardware_virtualized } sg_host_state; typedef struct { char *os_name; char *os_release; char *os_version; char *platform; char *hostname; unsigned bitwidth; sg_host_state host_state; unsigned ncpus; unsigned maxcpus; time_t uptime; time_t systime; } sg_host_info; __sg_public sg_host_info *sg_get_host_info(size_t *entries); __sg_public sg_host_info *sg_get_host_info_r(size_t *entries); #define sg_free_host_info(data) sg_free_stats_buf(data); typedef struct { unsigned long long user; unsigned long long kernel; unsigned long long idle; unsigned long long iowait; unsigned long long swap; unsigned long long nice; unsigned long long total; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long syscalls; unsigned long long interrupts; unsigned long long soft_interrupts; time_t systime; } sg_cpu_stats; __sg_public sg_cpu_stats *sg_get_cpu_stats(size_t *entries); __sg_public sg_cpu_stats *sg_get_cpu_stats_diff(size_t *entries); __sg_public sg_cpu_stats *sg_get_cpu_stats_r(size_t *entries); __sg_public sg_cpu_stats *sg_get_cpu_stats_diff_between(const sg_cpu_stats *cpu_now, const sg_cpu_stats *cpu_last, size_t *entries); #define sg_free_cpu_stats(data) sg_free_stats_buf(data); typedef struct { double user; double kernel; double idle; double iowait; double swap; double nice; time_t time_taken; } sg_cpu_percents; typedef enum sg_cpu_percent_source { sg_entire_cpu_percent, sg_last_diff_cpu_percent, sg_new_diff_cpu_percent } sg_cpu_percent_source; __sg_public sg_cpu_percents *sg_get_cpu_percents_of(sg_cpu_percent_source cps, size_t *entries); __sg_public sg_cpu_percents *sg_get_cpu_percents_r(sg_cpu_stats const * whereof, size_t *entries); #define sg_free_cpu_percents(data) sg_free_stats_buf(data); #define sg_get_cpu_percents(entries) sg_get_cpu_percents_of(sg_new_diff_cpu_percent, entries) typedef struct { unsigned long long total; unsigned long long free; unsigned long long used; unsigned long long cache; time_t systime; } sg_mem_stats; __sg_public sg_mem_stats *sg_get_mem_stats(size_t *entries); __sg_public sg_mem_stats *sg_get_mem_stats_r(size_t *entries); #define sg_free_mem_stats(data) sg_free_stats_buf(data); typedef struct { double min1; double min5; double min15; time_t systime; } sg_load_stats; __sg_public sg_load_stats *sg_get_load_stats(size_t *entries); __sg_public sg_load_stats *sg_get_load_stats_r(size_t *entries); #define sg_free_load_stats(data) sg_free_stats_buf(data); typedef struct { char *login_name; char *record_id; size_t record_id_size; char *device; char *hostname; pid_t pid; /* XXX sugesting to ad a uid here, too (padding + lookup-cache?) */ time_t login_time; time_t systime; } sg_user_stats; __sg_public sg_user_stats *sg_get_user_stats(size_t *entries); __sg_public sg_user_stats *sg_get_user_stats_r(size_t *entries); #define sg_free_user_stats(data) sg_free_stats_buf(data); typedef struct { unsigned long long total; unsigned long long used; unsigned long long free; time_t systime; } sg_swap_stats; __sg_public sg_swap_stats *sg_get_swap_stats(size_t *entries); __sg_public sg_swap_stats *sg_get_swap_stats_r(size_t *entries); #define sg_free_swap_stats(data) sg_free_stats_buf(data); typedef enum { sg_fs_unknown = 0, sg_fs_regular = 1 << 0, sg_fs_special = 1 << 1, sg_fs_loopback = 1 << 2, sg_fs_remote = 1 << 3, sg_fs_local = (sg_fs_regular | sg_fs_special), sg_fs_alltypes = (sg_fs_regular | sg_fs_special | sg_fs_loopback | sg_fs_remote) } sg_fs_device_type; typedef struct { char *device_name; char *fs_type; char *mnt_point; sg_fs_device_type device_type; /* XXX this isn't an enum, it's a bit-mask */ unsigned long long size; unsigned long long used; unsigned long long free; unsigned long long avail; unsigned long long total_inodes; unsigned long long used_inodes; unsigned long long free_inodes; unsigned long long avail_inodes; unsigned long long io_size; unsigned long long block_size; unsigned long long total_blocks; unsigned long long free_blocks; unsigned long long used_blocks; unsigned long long avail_blocks; time_t systime; } sg_fs_stats; __sg_public const char **sg_get_valid_filesystems(size_t *entries); __sg_public sg_error sg_set_valid_filesystems(const char *valid_fs[]); __sg_public sg_fs_stats *sg_get_fs_stats(size_t *entries); __sg_public sg_fs_stats *sg_get_fs_stats_r(size_t *entries); __sg_public sg_fs_stats *sg_get_fs_stats_diff(size_t *entries); __sg_public sg_fs_stats *sg_get_fs_stats_diff_between(const sg_fs_stats *cur, const sg_fs_stats *last, size_t *entries); #define sg_free_fs_stats(data) sg_free_stats_buf(data); __sg_public int sg_fs_compare_device_name(const void *va, const void *vb); __sg_public int sg_fs_compare_mnt_point(const void *va, const void *vb); typedef struct { char *disk_name; unsigned long long read_bytes; unsigned long long write_bytes; time_t systime; } sg_disk_io_stats; __sg_public sg_disk_io_stats *sg_get_disk_io_stats(size_t *entries); __sg_public sg_disk_io_stats *sg_get_disk_io_stats_r(size_t *entries); __sg_public sg_disk_io_stats *sg_get_disk_io_stats_diff(size_t *entries); __sg_public sg_disk_io_stats *sg_get_disk_io_stats_diff_between(const sg_disk_io_stats *cur, const sg_disk_io_stats *last, size_t *entries); #define sg_free_disk_io_stats(data) sg_free_stats_buf(data); __sg_public int sg_disk_io_compare_name(const void *va, const void *vb); __sg_public int sg_disk_io_compare_traffic(const void *va, const void *vb); typedef struct { char *interface_name; unsigned long long tx; unsigned long long rx; unsigned long long ipackets; unsigned long long opackets; unsigned long long ierrors; unsigned long long oerrors; unsigned long long collisions; time_t systime; } sg_network_io_stats; __sg_public sg_network_io_stats *sg_get_network_io_stats(size_t *entries); __sg_public sg_network_io_stats *sg_get_network_io_stats_r(size_t *entries); __sg_public sg_network_io_stats *sg_get_network_io_stats_diff(size_t *entries); __sg_public sg_network_io_stats *sg_get_network_io_stats_diff_between(const sg_network_io_stats *cur, const sg_network_io_stats *last, size_t *entries); #define sg_free_network_io_stats(data) sg_free_stats_buf(data); __sg_public int sg_network_io_compare_name(const void *va, const void *vb); typedef enum { SG_IFACE_DUPLEX_FULL, SG_IFACE_DUPLEX_HALF, SG_IFACE_DUPLEX_UNKNOWN } sg_iface_duplex; typedef enum { SG_IFACE_DOWN = 0, SG_IFACE_UP } sg_iface_updown; typedef struct { char *interface_name; unsigned long long speed; /* In factor/sec */ unsigned long long factor; sg_iface_duplex duplex; sg_iface_updown up; time_t systime; } sg_network_iface_stats; __sg_public sg_network_iface_stats *sg_get_network_iface_stats(size_t *entries); __sg_public sg_network_iface_stats *sg_get_network_iface_stats_r(size_t *entries); #define sg_free_network_iface_stats(data) sg_free_stats_buf(data); __sg_public int sg_network_iface_compare_name(const void *va, const void *vb); typedef struct { unsigned long long pages_pagein; unsigned long long pages_pageout; time_t systime; } sg_page_stats; __sg_public sg_page_stats *sg_get_page_stats(size_t *entries); __sg_public sg_page_stats *sg_get_page_stats_r(size_t *entries); __sg_public sg_page_stats *sg_get_page_stats_diff(size_t *entries); __sg_public sg_page_stats *sg_get_page_stats_diff_between(const sg_page_stats *now, const sg_page_stats *last, size_t *entries); #define sg_free_page_stats(data) sg_free_stats_buf(data); /* Recommend to add SG_PROCESS_STATE_IDLE */ typedef enum { SG_PROCESS_STATE_RUNNING, SG_PROCESS_STATE_SLEEPING, SG_PROCESS_STATE_STOPPED, SG_PROCESS_STATE_ZOMBIE, SG_PROCESS_STATE_UNKNOWN } sg_process_state; typedef struct { char *process_name; char *proctitle; pid_t pid; pid_t parent; /* Parent pid */ pid_t pgid; /* process id of process group leader */ pid_t sessid; /* session id of the session the process belongs to */ /* Windows does not have uid_t or gid_t types */ #ifndef WIN32 uid_t uid; uid_t euid; gid_t gid; gid_t egid; #else int uid; int euid; int gid; int egid; #endif unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long proc_size; /* in bytes */ unsigned long long proc_resident; /* in bytes */ time_t start_time; /* When was the process started */ time_t time_spent; /* time running in seconds */ double cpu_percent; int nice; sg_process_state state; time_t systime; } sg_process_stats; __sg_public sg_process_stats *sg_get_process_stats(size_t *entries); __sg_public sg_process_stats *sg_get_process_stats_r(size_t *entries); #define sg_free_process_stats(data) sg_free_stats_buf(data); __sg_public int sg_process_compare_name(const void *va, const void *vb); __sg_public int sg_process_compare_pid(const void *va, const void *vb); __sg_public int sg_process_compare_uid(const void *va, const void *vb); __sg_public int sg_process_compare_gid(const void *va, const void *vb); __sg_public int sg_process_compare_size(const void *va, const void *vb); __sg_public int sg_process_compare_res(const void *va, const void *vb); __sg_public int sg_process_compare_cpu(const void *va, const void *vb); __sg_public int sg_process_compare_time(const void *va, const void *vb); typedef struct { unsigned long long total; unsigned long long running; unsigned long long sleeping; unsigned long long stopped; unsigned long long zombie; unsigned long long unknown; time_t systime; } sg_process_count; typedef enum sg_process_count_source { sg_entire_process_count, sg_last_process_count } sg_process_count_source; __sg_public sg_process_count *sg_get_process_count_of(sg_process_count_source pcs); __sg_public sg_process_count *sg_get_process_count_r(sg_process_stats const * whereof); #define sg_get_process_count() sg_get_process_count_of(sg_entire_process_count) #define sg_free_process_count(data) sg_free_stats_buf(data); #if 0 void sg_log_init(const char *properties_pfx, const char *env_name, const char *argv0); #else #define sg_log_init(properties_pfx, env_name, argv0) \ do { (void)(properties_pfx); (void)(env_name); (void)(argv0); } while(0); #endif #ifdef __cplusplus } #endif #endif libstatgrab-0.90/src/libstatgrab/win32.c000644 001750 001750 00000020107 12200025312 020072 0ustar00tdbusers000000 000000 #include "tools.h" #ifdef WIN32 #include static HQUERY h_query; static HCOUNTER current_han[SG_WIN32_SIZE]; static char **diskio_names; static HCOUNTER *diskio_rhan; static HCOUNTER *diskio_whan; static int diskio_no; static int is_started = 0; /*static char **netio_names; static HCOUNTER *netio_rhan; static HCOUNTER *netio_shan; static int netio_no;*/ int add_counter(const char *fullCounterPath, HCOUNTER *phCounter) { PDH_STATUS pdh_status; pdh_status = PdhAddCounter(h_query, fullCounterPath, 0, phCounter); if(pdh_status != ERROR_SUCCESS) { //sg_set_error(SG_ERROR_PDHADD, fullCounterPath); phCounter = NULL; return -1; } return 0; } int read_counter_double(pdh_enum counter, double *result) { PDH_STATUS pdh_status; PDH_FMT_COUNTERVALUE *item_buf; HCOUNTER hcounter = current_han[counter]; if(hcounter == NULL) return -1; item_buf = sg_malloc(sizeof(PDH_FMT_COUNTERVALUE)); if (item_buf == NULL) { return -1; } pdh_status = PdhGetFormattedCounterValue(hcounter, PDH_FMT_DOUBLE, NULL, item_buf); if(pdh_status != ERROR_SUCCESS) { free(item_buf); return -1; } *result = item_buf->doubleValue; free(item_buf); return 0; } static int read_counter_large_int(HCOUNTER hcounter, long long *result) { PDH_STATUS pdh_status; PDH_FMT_COUNTERVALUE *item_buf; if(hcounter == NULL) return -1; item_buf = sg_malloc(sizeof(PDH_FMT_COUNTERVALUE)); if (item_buf == NULL) { return -1; } pdh_status = PdhGetFormattedCounterValue(hcounter, PDH_FMT_LARGE, NULL, item_buf); if(pdh_status != ERROR_SUCCESS) { free(item_buf); /*switch(pdh_status) { case PDH_INVALID_ARGUMENT: printf("invalid argument\n"); break; case PDH_INVALID_DATA: printf("invalid data\n"); break; case PDH_INVALID_HANDLE: printf("invalid handle\n"); break; }*/ return -1; } *result = item_buf->largeValue; free(item_buf); return 0; } int read_counter_large(pdh_enum counter, long long *result) { return read_counter_large_int(current_han[counter], result); } static char *get_instances(const char *object) { PDH_STATUS pdh_status; char *instancelistbuf; DWORD instancelistsize = 0; char *counterlistbuf; DWORD counterlistsize = 0; /* Get necessary size of buffers */ pdh_status = PdhEnumObjectItems(NULL, NULL, object, NULL, &counterlistsize, NULL, &instancelistsize, PERF_DETAIL_WIZARD, 0); /* 2k is dodgy and returns ERROR_SUCCESS even though the buffers were * NULL */ if(pdh_status == PDH_MORE_DATA || pdh_status == ERROR_SUCCESS) { instancelistbuf = sg_malloc(instancelistsize * sizeof(TCHAR)); counterlistbuf = sg_malloc(counterlistsize * sizeof(TCHAR)); if (instancelistbuf != NULL && counterlistbuf != NULL) { pdh_status = PdhEnumObjectItems(NULL, NULL, object, counterlistbuf, &counterlistsize, instancelistbuf, &instancelistsize, PERF_DETAIL_WIZARD, 0); if (pdh_status == ERROR_SUCCESS) { free(counterlistbuf); return instancelistbuf; } } if (counterlistbuf != NULL) free(counterlistbuf); if(instancelistbuf != NULL) free(instancelistbuf); } return NULL; } /* Gets the instance buffer. Removes _Total item. Works out how many items * there are. Returns these in a pointer list, rather than single buffer. */ static char **get_instance_list(const char *object, int *n) { char *thisinstance = NULL; char *instances = NULL; char **list; char **listtmp = NULL; int i; *n = 0; instances = get_instances(object); if (instances == NULL) return NULL; list = (char **)sg_malloc(sizeof(char *)); if (list == NULL) { return NULL; } for (thisinstance = instances; *thisinstance != 0; thisinstance += strlen(thisinstance) + 1) { /* Skip over the _Total item */ if (strcmp(thisinstance,"_Total") == 0) continue; listtmp = (char **)sg_realloc(list, sizeof(char *) * ((*n)+1)); if (listtmp == NULL) { goto out; } list = listtmp; list[*n] = sg_malloc(strlen(thisinstance) +1); if(list[*n] == NULL) { goto out; } list[*n] = strcpy(list[*n], thisinstance); ++*n; } free (instances); return list; out: for (i = 0; i < *n; i++) { free(list[i]); } free(list); return NULL; } char *get_diskio(const int no, long long *read, long long *write) { int result; char *name = NULL; if (no >= diskio_no || no < 0) return NULL; result = read_counter_large_int(diskio_rhan[no], read); result = result + read_counter_large_int(diskio_whan[no], write); if (result) { sg_set_error(SG_ERROR_PDHREAD, "diskio"); return NULL; } if (sg_update_string(&name, diskio_names[no])) return NULL; return name; } /* We do not fail on add_counter here, as some counters may not exist on all * hosts. The rest will work, and the missing/failed counters will die nicely * elsewhere */ static int add_all_monitors() { int i; char tmp[512]; add_counter(PDH_USER, &(current_han[SG_WIN32_PROC_USER])); add_counter(PDH_PRIV, &(current_han[SG_WIN32_PROC_PRIV])); add_counter(PDH_IDLE, &(current_han[SG_WIN32_PROC_IDLE])); add_counter(PDH_INTER, &(current_han[SG_WIN32_PROC_INT])); add_counter(PDH_MEM_CACHE, &(current_han[SG_WIN32_MEM_CACHE])); add_counter(PDH_UPTIME, &(current_han[SG_WIN32_UPTIME])); add_counter(PDH_PAGEIN, &(current_han[SG_WIN32_PAGEIN])); add_counter(PDH_PAGEOUT, &(current_han[SG_WIN32_PAGEOUT])); diskio_names = get_instance_list("PhysicalDisk", &diskio_no); if (diskio_names != NULL) { diskio_rhan = (HCOUNTER *)malloc(sizeof(HCOUNTER) * diskio_no); if (diskio_rhan == NULL) { PdhCloseQuery(h_query); return -1; } diskio_whan = (HCOUNTER *)malloc(sizeof(HCOUNTER) * diskio_no); if (diskio_whan == NULL) { PdhCloseQuery(h_query); free (diskio_rhan); return -1; } for (i = 0; i < diskio_no; i++) { snprintf(tmp, sizeof(tmp), PDH_DISKIOREAD, diskio_names[i]); add_counter(tmp, &diskio_rhan[i]); snprintf(tmp, sizeof(tmp), PDH_DISKIOWRITE, diskio_names[i]); add_counter(tmp, &diskio_whan[i]); } } return 0; } #endif /* Call before trying to get search results back, otherwise it'll be dead data */ int sg_win32_snapshot() { #ifdef WIN32 PDH_STATUS pdh_status; if(!is_started) { return -1; } pdh_status = PdhCollectQueryData(h_query); if(pdh_status != ERROR_SUCCESS) { sg_set_error(SG_ERROR_PDHCOLLECT, NULL); return -1; } #endif return 0; } /* Must be called before any values can be read. This creates all the * necessary PDH values */ int sg_win32_start_capture() { #ifdef WIN32 PDH_STATUS pdh_status; if(is_started) { return -1; } pdh_status = PdhOpenQuery(NULL, 0, &h_query); if(pdh_status != ERROR_SUCCESS) { char *mess = NULL; if(pdh_status == PDH_INVALID_ARGUMENT) mess = "Invalid argument o.O"; else if(pdh_status == PDH_MEMORY_ALLOCATION_FAILURE) mess = "Memory allocation failure"; sg_set_error(SG_ERROR_PDHOPEN, mess); return -1; } if (add_all_monitors() == -1) { return -1; } is_started = 1; #endif return 0; } /* Must be called before the program exits, or to close all the capture items * before opening with a call to start_capture */ void sg_win32_end_capture() { #ifdef WIN32 int i; PDH_STATUS pdh_status; if(!is_started) { return; } pdh_status = PdhCloseQuery(h_query); for (i=0; i < SG_WIN32_SIZE; ++i) { PdhRemoveCounter(current_han[i]); current_han[i] = NULL; } /*free_io(&diskio_no, diskio_names, diskio_rhan, diskio_whan); free_io(&netio_no, netio_names, netio_rhan, netio_shan);*/ for (i=0; i < diskio_no; ++i) { PdhRemoveCounter(diskio_rhan[i]); PdhRemoveCounter(diskio_whan[i]); free(diskio_names[i]); } free(diskio_names); free(diskio_rhan); free(diskio_whan); diskio_no = 0; is_started = 0; #endif } #ifdef WIN32 // DllMain() is the entry-point function for this DLL. BOOL WINAPI DllMain(HINSTANCE hinstDLL, // DLL module handle DWORD fdwReason, // reason called LPVOID lpvReserved) // reserved { switch(fdwReason) { case DLL_PROCESS_ATTACH: if( SG_ERROR_NONE != sg_win32_start_capture() ) return FALSE; break; case DLL_PROCESS_DETACH: sg_win32_end_capture(); break; #ifdef SG_WITH_THREADS case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: sg_destroy_globals(NULL); break; #endif default: break; } return TRUE; } #endif libstatgrab-0.90/src/libstatgrab/error.c000644 001750 001750 00000022341 12200025312 020263 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #include "tools.h" #include "globals.h" #if defined(HAVE_VSNPRINTF) # include #endif #define ERROR_ARG_MAX 4096 struct sg_error_glob { sg_error error; int errno_value; char error_arg[ERROR_ARG_MAX]; #if !defined(HAVE_VSNPRINTF) #define ERROR_OVERRIDE_PROTECTION MAGIC_EYE('e','r','r','e') unsigned error_override_protection; #endif }; #if !defined(HAVE_VSNPRINTF) static struct sg_error_glob pre_init_errs = { SG_ERROR_NONE, 0, { '\0' }, ERROR_OVERRIDE_PROTECTION }; #else static struct sg_error_glob pre_init_errs = { SG_ERROR_NONE, 0, { '\0' } }; #endif DEFAULT_INIT_COMP(error,NULL); static va_list empty_ap; static sg_error sg_error_init_comp(unsigned id) { struct sg_error_glob *error_glob = sg_comp_get_tls(id); GLOBAL_SET_ID(error,id); /* remember the initial errors ... */ if( error_glob && ( pre_init_errs.error != SG_ERROR_NONE ) ) { *error_glob = pre_init_errs; } /* init empty va_list */ memset( &empty_ap, 0, sizeof(empty_ap) ); return SG_ERROR_NONE; } EASY_COMP_DESTROY_FN(error) static void sg_error_cleanup_comp(void *p) { (void)p; TRACE_LOG_FMT("error", "sg_error_cleanup_comp(%p)", p); } static struct sg_error_glob * sg_get_error_glob(void) { struct sg_error_glob *error_glob = GLOBAL_GET_TLS(error); if( !error_glob ) error_glob = &pre_init_errs; return error_glob; } static sg_error sg_set_error_int(sg_error code, int errno_value, const char *arg, va_list ap) { struct sg_error_glob *error_glob = sg_get_error_glob(); error_glob->errno_value = errno_value; error_glob->error = code; if (arg != NULL) { #if defined(HAVE_VSNPRINTF) vsnprintf( error_glob->error_arg, sizeof(error_glob->error_arg), arg, ap ); #else error_glob->error_override_protection = ERROR_OVERRIDE_PROTECTION; vsprintf( error_glob->error_arg, arg, ap ); assert( error_glob->error_override_protection == ERROR_OVERRIDE_PROTECTION ); #endif } else { /* FIXME is this the best idea? */ error_glob->error_arg[0] = '\0'; } return code; } __sg_private void sg_clear_error(void) { struct sg_error_glob *error_glob = sg_get_error_glob(); if( error_glob ) { error_glob->error = SG_ERROR_NONE; error_glob->errno_value = 0; error_glob->error_arg[0] = '\0'; } } sg_error sg_set_error_fmt(sg_error code, const char *arg, ...) { va_list ap; sg_error rc; va_start(ap, arg); rc = sg_set_error_int(code, 0, arg, ap); va_end(ap); return rc; } sg_error sg_set_error_with_errno_fmt(sg_error code, const char *arg, ...) { va_list ap; sg_error rc; va_start(ap, arg); rc = sg_set_error_int(code, errno, arg, ap); va_end(ap); return rc; } sg_error sg_set_error_with_errno_code_fmt(sg_error code, int errno_value, const char *arg, ...) { va_list ap; sg_error rc; va_start(ap, arg); rc = sg_set_error_int(code, errno_value, arg, ap); va_end(ap); return rc; } sg_error sg_get_error(void) { struct sg_error_glob *error_glob = sg_get_error_glob(); if( !error_glob ) return SG_ERROR_MEMSTATUS; /* In this case we can't set our global last error :-( */ return error_glob->error; } const char * sg_get_error_arg(void) { struct sg_error_glob *error_glob = sg_get_error_glob(); if( !error_glob ) return NULL; /* In this case we can't set our global last error :-( */ return error_glob->error_arg; } int sg_get_error_errno(void) { struct sg_error_glob *error_glob = sg_get_error_glob(); if( !error_glob ) return EAGAIN; /* In this case we can't set our global last error :-( */ return error_glob->errno_value; } sg_error sg_get_error_details(sg_error_details *err_details){ struct sg_error_glob *error_glob = sg_get_error_glob(); if(NULL == err_details) { return sg_set_error_int(SG_ERROR_INVALID_ARGUMENT, 0, "sg_get_error_details", empty_ap); } if( !error_glob ) { err_details->error = SG_ERROR_MEMSTATUS; err_details->errno_value = EINVAL; err_details->error_arg = "Can't get tls buffer"; return SG_ERROR_MEMSTATUS; /* In this case we can't set our global last error :-( */ } err_details->error = error_glob->error; err_details->errno_value = error_glob->errno_value; err_details->error_arg = error_glob->error_arg; return SG_ERROR_NONE; } const char * sg_str_error(sg_error code) { switch (code) { case SG_ERROR_NONE: return "no error"; case SG_ERROR_INVALID_ARGUMENT: return "invalid argument"; case SG_ERROR_ASPRINTF: return "asprintf failed"; case SG_ERROR_SPRINTF: return "sprintf failed"; case SG_ERROR_DEVSTAT_GETDEVS: return "devstat_getdevs failed"; case SG_ERROR_DEVSTAT_SELECTDEVS: return "devstat_selectdevs failed"; case SG_ERROR_ENOENT: return "system call received ENOENT"; case SG_ERROR_GETIFADDRS: return "getifaddress failed"; case SG_ERROR_GETMNTINFO: return "getmntinfo failed"; case SG_ERROR_GETPAGESIZE: return "getpagesize failed"; case SG_ERROR_HOST: return "gather host information faile"; case SG_ERROR_KSTAT_DATA_LOOKUP: return "kstat_data_lookup failed"; case SG_ERROR_KSTAT_LOOKUP: return "kstat_lookup failed"; case SG_ERROR_KSTAT_OPEN: return "kstat_open failed"; case SG_ERROR_KSTAT_READ: return "kstat_read failed"; case SG_ERROR_KVM_GETSWAPINFO: return "kvm_getswapinfo failed"; case SG_ERROR_KVM_OPENFILES: return "kvm_openfiles failed"; case SG_ERROR_MALLOC: return "malloc failed"; case SG_ERROR_OPEN: return "failed to open file"; case SG_ERROR_OPENDIR: return "failed to open directory"; case SG_ERROR_READDIR: return "failed to read directory"; case SG_ERROR_PARSE: return "failed to parse input"; case SG_ERROR_SETEGID: return "setegid failed"; case SG_ERROR_SETEUID: return "seteuid failed"; case SG_ERROR_SETMNTENT: return "setmntent failed"; case SG_ERROR_SOCKET: return "socket failed"; case SG_ERROR_SWAPCTL: return "swapctl failed"; case SG_ERROR_SYSINFO: return "sysinfo failed"; case SG_ERROR_SYSCONF: return "sysconf failed"; case SG_ERROR_SYSCTL: return "sysctl failed"; case SG_ERROR_SYSCTLBYNAME: return "sysctlbyname failed"; case SG_ERROR_SYSCTLNAMETOMIB: return "sysctlnametomib failed"; case SG_ERROR_MACHCALL: return "mach kernel operation failed"; case SG_ERROR_IOKIT: return "I/O Kit operation failed"; case SG_ERROR_UNAME: return "uname failed"; case SG_ERROR_UNSUPPORTED: return "unsupported function"; case SG_ERROR_XSW_VER_MISMATCH: return "XSW version mismatch"; case SG_ERROR_PSTAT: return "pstat failed"; case SG_ERROR_PDHOPEN: return "PDH open failed"; case SG_ERROR_PDHCOLLECT: return "PDH snapshot failed"; case SG_ERROR_PDHADD: return "PDH add counter failed"; case SG_ERROR_PDHREAD: return "PDH read counter failed"; case SG_ERROR_DEVICES: return "failed to get device list"; case SG_ERROR_PERMISSION: return "access violation"; case SG_ERROR_DISKINFO: return "disk function failed"; case SG_ERROR_MEMSTATUS: return "memory status failed"; case SG_ERROR_GETMSG: return "getmsg failed"; case SG_ERROR_PUTMSG: return "putmsg failed"; case SG_ERROR_INITIALISATION: return "initialization error"; case SG_ERROR_MUTEX_LOCK: return "lock mutex failed"; case SG_ERROR_MUTEX_UNLOCK: return "unlock mutex failed"; } return "unknown error"; } #define SG_STRPERROR_BUF_SIZE 1024 char * sg_strperror(char **buf, const sg_error_details * const err_details) { #ifdef HAVE_STRERROR_R char errno_buf[128] = { '\0' }; #endif char *errno_msg = NULL; sg_error_details err_det; if((NULL == buf) || (NULL != *buf)) { sg_set_error_int(SG_ERROR_INVALID_ARGUMENT, 0, "strperror", empty_ap); return NULL; } if(NULL == err_details) { sg_get_error_details(&err_det); } else { err_det = *err_details; } if( NULL != (*buf = malloc(SG_STRPERROR_BUF_SIZE)) ) { if(err_det.errno_value) { #ifdef HAVE_STRERROR_R # ifdef STRERROR_R_RETURN_INT int rc; # else char *rc; # endif rc = strerror_r(err_det.errno_value, errno_buf, sizeof(errno_buf)); # ifdef STRERROR_R_RETURN_INT if(0 != rc) # else if(NULL == rc) # endif { sg_set_error_int(SG_ERROR_MALLOC, errno, "strerror_r", empty_ap); free(*buf); *buf = NULL; return NULL; } else { # ifdef STRERROR_R_RETURN_INT errno_msg = errno_buf; # else errno_msg = rc; # endif } #else errno_msg = strerror(errno); #endif } snprintf( *buf, SG_STRPERROR_BUF_SIZE, "%s (%s%s%s)", sg_str_error(err_det.error), err_det.errno_value ? errno_msg : "", err_det.errno_value ? ": " : "", err_det.error_arg ? err_det.error_arg : "" ); } else { sg_set_error_int(SG_ERROR_MALLOC, 0, "sg_strperror", empty_ap); } return *buf; } libstatgrab-0.90/src/libstatgrab/statgrab.h.in000644 001750 001750 00000034022 12200025312 021352 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #ifndef STATGRAB_H #define STATGRAB_H #ifdef __cplusplus extern "C" { #endif #include #include #if @WITH_VISIBILITY_SUPPORT@ #define __sg_export @SG_EXPORT@ #define __sg_import @SG_IMPORT@ #define __sg_private @SG_PRIVATE@ #else #define __sg_export #define __sg_import #define __sg_private #endif #ifdef BUILD_LIBSTATGRAB #define __sg_public __sg_export #else #define __sg_public __sg_import #endif /* FIXME typedefs for 32/64-bit types */ /* FIXME maybe tidy up field names? */ /* FIXME comments for less obvious fields */ typedef enum { SG_ERROR_NONE = 0, SG_ERROR_INVALID_ARGUMENT, SG_ERROR_ASPRINTF, SG_ERROR_SPRINTF, SG_ERROR_DEVICES, SG_ERROR_DEVSTAT_GETDEVS, SG_ERROR_DEVSTAT_SELECTDEVS, SG_ERROR_DISKINFO, SG_ERROR_ENOENT, SG_ERROR_GETIFADDRS, SG_ERROR_GETMNTINFO, SG_ERROR_GETPAGESIZE, SG_ERROR_HOST, SG_ERROR_KSTAT_DATA_LOOKUP, SG_ERROR_KSTAT_LOOKUP, SG_ERROR_KSTAT_OPEN, SG_ERROR_KSTAT_READ, SG_ERROR_KVM_GETSWAPINFO, SG_ERROR_KVM_OPENFILES, SG_ERROR_MALLOC, SG_ERROR_MEMSTATUS, SG_ERROR_OPEN, SG_ERROR_OPENDIR, SG_ERROR_READDIR, SG_ERROR_PARSE, SG_ERROR_PDHADD, SG_ERROR_PDHCOLLECT, SG_ERROR_PDHOPEN, SG_ERROR_PDHREAD, SG_ERROR_PERMISSION, SG_ERROR_PSTAT, SG_ERROR_SETEGID, SG_ERROR_SETEUID, SG_ERROR_SETMNTENT, SG_ERROR_SOCKET, SG_ERROR_SWAPCTL, SG_ERROR_SYSCONF, SG_ERROR_SYSCTL, SG_ERROR_SYSCTLBYNAME, SG_ERROR_SYSCTLNAMETOMIB, SG_ERROR_SYSINFO, SG_ERROR_MACHCALL, SG_ERROR_IOKIT, SG_ERROR_UNAME, SG_ERROR_UNSUPPORTED, SG_ERROR_XSW_VER_MISMATCH, SG_ERROR_GETMSG, SG_ERROR_PUTMSG, SG_ERROR_INITIALISATION, SG_ERROR_MUTEX_LOCK, SG_ERROR_MUTEX_UNLOCK } sg_error; typedef struct sg_error_details { sg_error error; int errno_value; const char *error_arg; } sg_error_details; __sg_public sg_error sg_get_error(void); __sg_public const char *sg_get_error_arg(void); __sg_public int sg_get_error_errno(void); __sg_public sg_error sg_get_error_details(sg_error_details *err_details); __sg_public const char * sg_str_error(sg_error code); __sg_public char *sg_strperror(char **buf, const sg_error_details * const err_details); /* * initializes libstatgrab * @param ignore_init_errors - set to a true value to ignore initialization * errors of component initializations (e.g. permission problems for kvm * on freebsd) * XXX requires each component to provide a get__init_error() and a * reinit_() */ __sg_public sg_error sg_init(int ignore_init_errors); __sg_public sg_error sg_snapshot(void); __sg_public sg_error sg_shutdown(void); __sg_public sg_error sg_drop_privileges(void); __sg_public size_t sg_get_nelements(const void *data); __sg_public sg_error sg_free_stats_buf(void *data); #if @WITH_THREADS_CONFIGURED@ #define SG_SUPPORT_THREADS __sg_public sg_error sg_lock_mutex(const char *mutex_name); __sg_public sg_error sg_unlock_mutex(const char *mutex_name); #else #define sg_lock_mutex(name) SG_ERROR_NONE #define sg_unlock_mutex(name) SG_ERROR_NONE #endif typedef enum { sg_unknown_configuration = 0, sg_physical_host, sg_virtual_machine, sg_paravirtual_machine, sg_hardware_virtualized } sg_host_state; typedef struct { char *os_name; char *os_release; char *os_version; char *platform; char *hostname; unsigned bitwidth; sg_host_state host_state; unsigned ncpus; unsigned maxcpus; time_t uptime; time_t systime; } sg_host_info; __sg_public sg_host_info *sg_get_host_info(size_t *entries); __sg_public sg_host_info *sg_get_host_info_r(size_t *entries); #define sg_free_host_info(data) sg_free_stats_buf(data); typedef struct { unsigned long long user; unsigned long long kernel; unsigned long long idle; unsigned long long iowait; unsigned long long swap; unsigned long long nice; unsigned long long total; unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long syscalls; unsigned long long interrupts; unsigned long long soft_interrupts; time_t systime; } sg_cpu_stats; __sg_public sg_cpu_stats *sg_get_cpu_stats(size_t *entries); __sg_public sg_cpu_stats *sg_get_cpu_stats_diff(size_t *entries); __sg_public sg_cpu_stats *sg_get_cpu_stats_r(size_t *entries); __sg_public sg_cpu_stats *sg_get_cpu_stats_diff_between(const sg_cpu_stats *cpu_now, const sg_cpu_stats *cpu_last, size_t *entries); #define sg_free_cpu_stats(data) sg_free_stats_buf(data); typedef struct { double user; double kernel; double idle; double iowait; double swap; double nice; time_t time_taken; } sg_cpu_percents; typedef enum sg_cpu_percent_source { sg_entire_cpu_percent, sg_last_diff_cpu_percent, sg_new_diff_cpu_percent } sg_cpu_percent_source; __sg_public sg_cpu_percents *sg_get_cpu_percents_of(sg_cpu_percent_source cps, size_t *entries); __sg_public sg_cpu_percents *sg_get_cpu_percents_r(sg_cpu_stats const * whereof, size_t *entries); #define sg_free_cpu_percents(data) sg_free_stats_buf(data); #define sg_get_cpu_percents(entries) sg_get_cpu_percents_of(sg_new_diff_cpu_percent, entries) typedef struct { unsigned long long total; unsigned long long free; unsigned long long used; unsigned long long cache; time_t systime; } sg_mem_stats; __sg_public sg_mem_stats *sg_get_mem_stats(size_t *entries); __sg_public sg_mem_stats *sg_get_mem_stats_r(size_t *entries); #define sg_free_mem_stats(data) sg_free_stats_buf(data); typedef struct { double min1; double min5; double min15; time_t systime; } sg_load_stats; __sg_public sg_load_stats *sg_get_load_stats(size_t *entries); __sg_public sg_load_stats *sg_get_load_stats_r(size_t *entries); #define sg_free_load_stats(data) sg_free_stats_buf(data); typedef struct { char *login_name; char *record_id; size_t record_id_size; char *device; char *hostname; pid_t pid; /* XXX sugesting to ad a uid here, too (padding + lookup-cache?) */ time_t login_time; time_t systime; } sg_user_stats; __sg_public sg_user_stats *sg_get_user_stats(size_t *entries); __sg_public sg_user_stats *sg_get_user_stats_r(size_t *entries); #define sg_free_user_stats(data) sg_free_stats_buf(data); typedef struct { unsigned long long total; unsigned long long used; unsigned long long free; time_t systime; } sg_swap_stats; __sg_public sg_swap_stats *sg_get_swap_stats(size_t *entries); __sg_public sg_swap_stats *sg_get_swap_stats_r(size_t *entries); #define sg_free_swap_stats(data) sg_free_stats_buf(data); typedef enum { sg_fs_unknown = 0, sg_fs_regular = 1 << 0, sg_fs_special = 1 << 1, sg_fs_loopback = 1 << 2, sg_fs_remote = 1 << 3, sg_fs_local = (sg_fs_regular | sg_fs_special), sg_fs_alltypes = (sg_fs_regular | sg_fs_special | sg_fs_loopback | sg_fs_remote) } sg_fs_device_type; typedef struct { char *device_name; char *fs_type; char *mnt_point; sg_fs_device_type device_type; /* XXX this isn't an enum, it's a bit-mask */ unsigned long long size; unsigned long long used; unsigned long long free; unsigned long long avail; unsigned long long total_inodes; unsigned long long used_inodes; unsigned long long free_inodes; unsigned long long avail_inodes; unsigned long long io_size; unsigned long long block_size; unsigned long long total_blocks; unsigned long long free_blocks; unsigned long long used_blocks; unsigned long long avail_blocks; time_t systime; } sg_fs_stats; __sg_public const char **sg_get_valid_filesystems(size_t *entries); __sg_public sg_error sg_set_valid_filesystems(const char *valid_fs[]); __sg_public sg_fs_stats *sg_get_fs_stats(size_t *entries); __sg_public sg_fs_stats *sg_get_fs_stats_r(size_t *entries); __sg_public sg_fs_stats *sg_get_fs_stats_diff(size_t *entries); __sg_public sg_fs_stats *sg_get_fs_stats_diff_between(const sg_fs_stats *cur, const sg_fs_stats *last, size_t *entries); #define sg_free_fs_stats(data) sg_free_stats_buf(data); __sg_public int sg_fs_compare_device_name(const void *va, const void *vb); __sg_public int sg_fs_compare_mnt_point(const void *va, const void *vb); typedef struct { char *disk_name; unsigned long long read_bytes; unsigned long long write_bytes; time_t systime; } sg_disk_io_stats; __sg_public sg_disk_io_stats *sg_get_disk_io_stats(size_t *entries); __sg_public sg_disk_io_stats *sg_get_disk_io_stats_r(size_t *entries); __sg_public sg_disk_io_stats *sg_get_disk_io_stats_diff(size_t *entries); __sg_public sg_disk_io_stats *sg_get_disk_io_stats_diff_between(const sg_disk_io_stats *cur, const sg_disk_io_stats *last, size_t *entries); #define sg_free_disk_io_stats(data) sg_free_stats_buf(data); __sg_public int sg_disk_io_compare_name(const void *va, const void *vb); __sg_public int sg_disk_io_compare_traffic(const void *va, const void *vb); typedef struct { char *interface_name; unsigned long long tx; unsigned long long rx; unsigned long long ipackets; unsigned long long opackets; unsigned long long ierrors; unsigned long long oerrors; unsigned long long collisions; time_t systime; } sg_network_io_stats; __sg_public sg_network_io_stats *sg_get_network_io_stats(size_t *entries); __sg_public sg_network_io_stats *sg_get_network_io_stats_r(size_t *entries); __sg_public sg_network_io_stats *sg_get_network_io_stats_diff(size_t *entries); __sg_public sg_network_io_stats *sg_get_network_io_stats_diff_between(const sg_network_io_stats *cur, const sg_network_io_stats *last, size_t *entries); #define sg_free_network_io_stats(data) sg_free_stats_buf(data); __sg_public int sg_network_io_compare_name(const void *va, const void *vb); typedef enum { SG_IFACE_DUPLEX_FULL, SG_IFACE_DUPLEX_HALF, SG_IFACE_DUPLEX_UNKNOWN } sg_iface_duplex; typedef enum { SG_IFACE_DOWN = 0, SG_IFACE_UP } sg_iface_updown; typedef struct { char *interface_name; unsigned long long speed; /* In factor/sec */ unsigned long long factor; sg_iface_duplex duplex; sg_iface_updown up; time_t systime; } sg_network_iface_stats; __sg_public sg_network_iface_stats *sg_get_network_iface_stats(size_t *entries); __sg_public sg_network_iface_stats *sg_get_network_iface_stats_r(size_t *entries); #define sg_free_network_iface_stats(data) sg_free_stats_buf(data); __sg_public int sg_network_iface_compare_name(const void *va, const void *vb); typedef struct { unsigned long long pages_pagein; unsigned long long pages_pageout; time_t systime; } sg_page_stats; __sg_public sg_page_stats *sg_get_page_stats(size_t *entries); __sg_public sg_page_stats *sg_get_page_stats_r(size_t *entries); __sg_public sg_page_stats *sg_get_page_stats_diff(size_t *entries); __sg_public sg_page_stats *sg_get_page_stats_diff_between(const sg_page_stats *now, const sg_page_stats *last, size_t *entries); #define sg_free_page_stats(data) sg_free_stats_buf(data); /* Recommend to add SG_PROCESS_STATE_IDLE */ typedef enum { SG_PROCESS_STATE_RUNNING, SG_PROCESS_STATE_SLEEPING, SG_PROCESS_STATE_STOPPED, SG_PROCESS_STATE_ZOMBIE, SG_PROCESS_STATE_UNKNOWN } sg_process_state; typedef struct { char *process_name; char *proctitle; pid_t pid; pid_t parent; /* Parent pid */ pid_t pgid; /* process id of process group leader */ pid_t sessid; /* session id of the session the process belongs to */ /* Windows does not have uid_t or gid_t types */ #ifndef WIN32 uid_t uid; uid_t euid; gid_t gid; gid_t egid; #else int uid; int euid; int gid; int egid; #endif unsigned long long context_switches; unsigned long long voluntary_context_switches; unsigned long long involuntary_context_switches; unsigned long long proc_size; /* in bytes */ unsigned long long proc_resident; /* in bytes */ time_t start_time; /* When was the process started */ time_t time_spent; /* time running in seconds */ double cpu_percent; int nice; sg_process_state state; time_t systime; } sg_process_stats; __sg_public sg_process_stats *sg_get_process_stats(size_t *entries); __sg_public sg_process_stats *sg_get_process_stats_r(size_t *entries); #define sg_free_process_stats(data) sg_free_stats_buf(data); __sg_public int sg_process_compare_name(const void *va, const void *vb); __sg_public int sg_process_compare_pid(const void *va, const void *vb); __sg_public int sg_process_compare_uid(const void *va, const void *vb); __sg_public int sg_process_compare_gid(const void *va, const void *vb); __sg_public int sg_process_compare_size(const void *va, const void *vb); __sg_public int sg_process_compare_res(const void *va, const void *vb); __sg_public int sg_process_compare_cpu(const void *va, const void *vb); __sg_public int sg_process_compare_time(const void *va, const void *vb); typedef struct { unsigned long long total; unsigned long long running; unsigned long long sleeping; unsigned long long stopped; unsigned long long zombie; unsigned long long unknown; time_t systime; } sg_process_count; typedef enum sg_process_count_source { sg_entire_process_count, sg_last_process_count } sg_process_count_source; __sg_public sg_process_count *sg_get_process_count_of(sg_process_count_source pcs); __sg_public sg_process_count *sg_get_process_count_r(sg_process_stats const * whereof); #define sg_get_process_count() sg_get_process_count_of(sg_entire_process_count) #define sg_free_process_count(data) sg_free_stats_buf(data); #if @WITH_LIBLOG4CPLUS@ void sg_log_init(const char *properties_pfx, const char *env_name, const char *argv0); #else #define sg_log_init(properties_pfx, env_name, argv0) \ do { (void)(properties_pfx); (void)(env_name); (void)(argv0); } while(0); #endif #ifdef __cplusplus } #endif #endif libstatgrab-0.90/src/libstatgrab/vector.h000644 001750 001750 00000013540 12200025312 020442 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #ifndef STATGRAB_VECTOR_H #define STATGRAB_VECTOR_H #include typedef void (*vector_init_function)(void *item); typedef sg_error (*vector_copy_function)(const void *src, void *dst); typedef sg_error (*vector_compute_diff_function)(const void *src, void *dst); typedef int (*vector_compare_function)(const void *a, const void *b); typedef void (*vector_destroy_function)(void *item); typedef struct sg_vector_init_info { size_t item_size; vector_init_function init_fn; vector_copy_function copy_fn; vector_compute_diff_function compute_diff_fn; vector_compare_function compare_fn; vector_destroy_function destroy_fn; } sg_vector_init_info; #define VECTOR_INIT_INFO_FULL_INIT(type) \ struct sg_vector_init_info type##_vector_init_info = { \ sizeof(type), \ (vector_init_function)(type##_item_init), \ (vector_copy_function)(type##_item_copy), \ (vector_compute_diff_function)(type##_item_compute_diff), \ (vector_compare_function)(type##_item_compare), \ (vector_destroy_function)(type##_item_destroy) \ } #define VECTOR_INIT_INFO_EMPTY_INIT(type) \ struct sg_vector_init_info type##_vector_init_info = { sizeof(type), NULL, NULL, NULL, NULL, NULL } #define VECTOR_INIT_INFO(type) type##_vector_init_info #ifndef NDEBUG typedef struct sg_vector { size_t start_eye; size_t used_count; size_t alloc_count; size_t block_shift; struct sg_vector_init_info info; size_t final_eye; } sg_vector; __sg_private sg_error sg_prove_vector(const sg_vector *vec); #else typedef struct sg_vector { size_t used_count; size_t alloc_count; size_t block_shift; struct sg_vector_init_info info; } sg_vector; #define sg_prove_vector(x) SG_ERROR_NONE #endif /* Create a vector. Returns address to vector on success or NULL on * out-of-memory. Allocates space for initially block_size items. */ __sg_private struct sg_vector *sg_vector_create(size_t block_size, size_t alloc_count, size_t initial_used, const sg_vector_init_info * const info); /* clear a vector - but do not free the memory itself */ __sg_private void sg_vector_clear(struct sg_vector *vector); #define VECTOR_CREATE(type, block_size) \ sg_vector_create((size_t)(block_size), (size_t)(block_size), 0, & VECTOR_INIT_INFO(type)) #define VECTOR_CLEAR(vector) \ sg_vector_clear(vector) /* Resize a vector. Returns new vector on success, NULL on out-of-memory. * On out-of-memory, the old contents of the vector will be destroyed and * the old vector will be freed. */ __sg_private struct sg_vector *sg_vector_resize(struct sg_vector *vector, size_t new_count); /* Free a previously allocated vector. */ __sg_private void sg_vector_free(struct sg_vector *vector); #define VECTOR_CREATE_OR_RESIZE(vector, new_count, type) \ vector ? sg_vector_resize(vector, (size_t)(new_count)) \ : sg_vector_create((size_t)(new_count), (size_t)(new_count), \ (size_t)(new_count), & VECTOR_INIT_INFO(type)) #ifdef STRUCT_SG_VECTOR_ALIGN_OK #define VECTOR_SIZE ((size_t)(((struct sg_vector *)0) + ((size_t)1))) #define VECTOR_DATA(vector) \ (vector ? (void *)&((vector)[1]) : NULL) #define VECTOR_DATA_CONST(vector) \ (vector ? (void const *)&((vector)[1]) : NULL) #define VECTOR_ADDR_ARITH(ptr) \ &(((struct sg_vector *)ptr)[-1]) #define VECTOR_CONST_ADDR_ARITH(ptr) \ &(((struct sg_vector const *)ptr)[-1]) #else struct sg_vector_size_helper { struct sg_vector v; long long ll; }; #define VECTOR_SIZE offsetof(struct sg_vector_size_helper,ll) /* Return the data ptr of a vector */ #define VECTOR_DATA(vector) \ (vector ? (void *)(((char *)vector)+VECTOR_SIZE) : NULL) #define VECTOR_DATA_CONST(vector) \ (vector ? (void const *)(((char *)vector)+VECTOR_SIZE) : NULL) #define VECTOR_ADDR_ARITH(ptr) \ (sg_vector *)(((char *)(ptr))-VECTOR_SIZE) #define VECTOR_CONST_ADDR_ARITH(ptr) \ (struct sg_vector const *)(((char const *)(ptr))-VECTOR_SIZE) #endif /* Return the vector for a data */ #define VECTOR_ADDRESS(ptr) \ (ptr ? (SG_ERROR_NONE == sg_prove_vector(VECTOR_ADDR_ARITH(ptr)) ? VECTOR_ADDR_ARITH(ptr) : NULL ) : NULL) #define VECTOR_ADDRESS_CONST(ptr) \ (ptr ? (SG_ERROR_NONE == sg_prove_vector(VECTOR_CONST_ADDR_ARITH(ptr)) ? VECTOR_CONST_ADDR_ARITH(ptr) : NULL ) : NULL) /* Return the current size of a vector. */ #define VECTOR_ITEM_COUNT(vector) \ (vector ? (vector)->used_count : 0) #define VECTOR_UPDATE_ERROR_CLEANUP #define VECTOR_UPDATE(vectorptr,new_count,data,datatype) \ do { \ if( NULL != (*(vectorptr) = VECTOR_CREATE_OR_RESIZE(*(vectorptr), new_count, datatype)) ){ \ assert(VECTOR_ITEM_COUNT(*(vectorptr)) == ((size_t)(new_count))); \ data = (datatype *)(VECTOR_DATA(*(vectorptr))); \ } \ else if( !new_count ) {\ data = NULL; \ } \ else {\ VECTOR_UPDATE_ERROR_CLEANUP \ return sg_get_error(); \ } \ } while( 0 ) __sg_private sg_vector *sg_vector_clone(const sg_vector *src); __sg_private sg_error sg_vector_clone_into(sg_vector **dest, const sg_vector *src); __sg_private sg_error sg_vector_compute_diff(sg_vector **dest_vector_ptr, const sg_vector *cur_vector, const sg_vector *last_vector); #endif /* ?STATGRAB_VECTOR_H */ libstatgrab-0.90/src/libstatgrab/cpu_stats.c000644 001750 001750 00000050204 12200025312 021136 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id$ */ #include "tools.h" #define SG_CPU_NOW_IDX 0 #define SG_CPU_DIFF_IDX 1 #define SG_CPU_PERCENT_IDX 2 #define SG_CPU_IDX_COUNT 3 #if defined(ALLBSD) \ && !defined(KERN_CP_TIME) && !defined(KERN_CPTIME) \ && !(defined(HAVE_HOST_STATISTICS) || defined(HAVE_HOST_STATISTICS64)) \ && !(defined(HAVE_STRUCT_KINFO_CPUTIME) && defined(HAVE_KINFO_GET_SCHED_CPUTIME)) EXTENDED_COMP_SETUP(cpu,SG_CPU_IDX_COUNT,NULL); static int cp_time_mib[2]; sg_error sg_cpu_init_comp(unsigned id){ size_t len = lengthof(cp_time_mib); GLOBAL_SET_ID(cpu,id); if( -1 == sysctlnametomib( "kern.cp_time", cp_time_mib, &len ) ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("cpu", SG_ERROR_SYSCTLNAMETOMIB, "kern.cp_time"); } return SG_ERROR_NONE; } EASY_COMP_DESTROY_FN(cpu) EASY_COMP_CLEANUP_FN(cpu,SG_CPU_IDX_COUNT) #else EASY_COMP_SETUP(cpu,SG_CPU_IDX_COUNT,NULL); #endif /* Internal function to fill cpu_stats. No need to resize - we don't have * different stats per physical cpu. */ static sg_error sg_get_cpu_stats_int(sg_cpu_stats *cpu_stats_buf) { #ifdef HPUX struct pst_dynamic pstat_dynamic; struct pst_vminfo pstat_vminfo; int i; #elif defined(AIX) perfstat_cpu_total_t all_cpu_info; int rc; #elif defined(SOLARIS) kstat_ctl_t *kc; kstat_t *ksp; cpu_stat_t cs; #elif defined(LINUX) || defined(CYGWIN) FILE *f; int proc_stat_cpu; char line[1024]; int matched = 0; #elif defined(ALLBSD) # if defined(HAVE_HOST_STATISTICS) || defined(HAVE_HOST_STATISTICS64) host_cpu_load_info_data_t cpustats; mach_msg_type_number_t count = HOST_CPU_LOAD_INFO_COUNT; mach_port_t self_host_port; kern_return_t rc; #define DEFINED_MIB int mib[2]; # elif defined(HAVE_STRUCT_KINFO_CPUTIME) && defined(HAVE_KINFO_GET_SCHED_CPUTIME) int rc; struct kinfo_cputime cpu_time; # elif defined(KERN_CP_TIME) int mib[2] = { CTL_KERN, KERN_CP_TIME }; uint64_t cp_time[CPUSTATES]; #define DEFINED_MIB # elif defined(KERN_CPTIME) int mib[2] = { CTL_KERN, KERN_CPTIME }; long cp_time[CPUSTATES]; #define DEFINED_MIB # else int mib[2] = { cp_time_mib[0], cp_time_mib[1] }; long cp_time[CPUSTATES]; #define DEFINED_MIB # endif size_t size; # if defined(VM_UVMEXP2) && defined(HAVE_STRUCT_UVMEXP_SYSCTL) struct uvmexp_sysctl uvmexp; # ifndef DEFINED_MIB int mib[2]; # endif # elif defined(VM_UVMEXP) && defined(HAVE_STRUCT_UVMEXP_SWTCH) struct uvmexp uvmexp; # ifndef DEFINED_MIB int mib[2]; # endif # elif defined(HAVE_STRUCT_VMMETER) && defined(VM_METER) struct vmmeter vmmeter; # ifndef DEFINED_MIB #define DEFINED_MIB int mib[2]; # endif # endif #endif memset( cpu_stats_buf, 0, sizeof(*cpu_stats_buf) ); #if 0 cpu_stats_buf->user=0; /* Not stored in linux or freebsd */ cpu_stats_buf->iowait=0; cpu_stats_buf->kernel=0; cpu_stats_buf->idle=0; /* Not stored in linux, freebsd, hpux, aix or windows */ cpu_stats_buf->swap=0; cpu_stats_buf->total=0; /* Not stored in aix, solaris or windows */ cpu_stats_buf->nice=0; #endif #ifdef HPUX if (pstat_getdynamic(&pstat_dynamic, sizeof(pstat_dynamic), 1, 0) == -1) { RETURN_WITH_SET_ERROR_WITH_ERRNO("cpu", SG_ERROR_PSTAT, "pstat_dynamic"); } if (pstat_getvminfo(&pstat_vminfo, sizeof(pstat_vminfo), 1, 0) == -1) { RETURN_WITH_SET_ERROR_WITH_ERRNO("cpu", SG_ERROR_PSTAT, "pstat_vminfo"); } cpu_stats_buf->user = pstat_dynamic.psd_cpu_time[CP_USER]; cpu_stats_buf->iowait = pstat_dynamic.psd_cpu_time[CP_WAIT]; cpu_stats_buf->kernel = pstat_dynamic.psd_cpu_time[CP_SSYS] + pstat_dynamic.psd_cpu_time[CP_SYS]; cpu_stats_buf->idle = pstat_dynamic.psd_cpu_time[CP_IDLE]; cpu_stats_buf->nice = pstat_dynamic.psd_cpu_time[CP_NICE]; for (i = 0; i < PST_MAX_CPUSTATES; i++) { cpu_stats_buf->total += pstat_dynamic.psd_cpu_time[i]; } cpu_stats_buf->context_switches = pstat_vminfo.psv_sswtch; cpu_stats_buf->syscalls = pstat_vminfo.psv_ssyscall; /* voluntary/involuntary context switches only per process */ cpu_stats_buf->interrupts = pstat_vminfo.psv_sintr; /* cpu_stats_buf->soft_interrupts = unknown: psv_sfaults, psv_strap?; */ #elif defined(AIX) bzero(&all_cpu_info, sizeof(all_cpu_info)); rc = perfstat_cpu_total( NULL, &all_cpu_info, sizeof(all_cpu_info), 1); if( -1 == rc ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("cpu", SG_ERROR_PSTAT, "perfstat_cpu_total"); } cpu_stats_buf->user = all_cpu_info.user; cpu_stats_buf->iowait = all_cpu_info.wait; cpu_stats_buf->kernel = all_cpu_info.sys; cpu_stats_buf->idle = all_cpu_info.idle; cpu_stats_buf->total = all_cpu_info.user + all_cpu_info.wait + all_cpu_info.sys + all_cpu_info.idle; cpu_stats_buf->context_switches = all_cpu_info.pswitch; cpu_stats_buf->syscalls = all_cpu_info.syscall; /* voluntary/involuntary context switches only per cpu (summarize) on AIX6+ */ cpu_stats_buf->interrupts = all_cpu_info.devintrs; cpu_stats_buf->soft_interrupts = all_cpu_info.softintrs; #elif defined(SOLARIS) if ((kc = kstat_open()) == NULL) { RETURN_WITH_SET_ERROR("cpu", SG_ERROR_KSTAT_OPEN, NULL); } for (ksp = kc->kc_chain; ksp!=NULL; ksp = ksp->ks_next) { if (ksp->ks_type != KSTAT_TYPE_RAW) continue; if ((strcmp(ksp->ks_module, "cpu_stat")) != 0) continue; if (kstat_read(kc, ksp, &cs) == -1) continue; cpu_stats_buf->user += (long long)cs.cpu_sysinfo.cpu[CPU_USER]; cpu_stats_buf->kernel += (long long)cs.cpu_sysinfo.cpu[CPU_KERNEL]; cpu_stats_buf->idle += (long long)cs.cpu_sysinfo.cpu[CPU_IDLE]; cpu_stats_buf->iowait += (long long)cs.cpu_sysinfo.wait[W_IO]+(long long)cs.cpu_sysinfo.wait[W_PIO]; cpu_stats_buf->swap += (long long)cs.cpu_sysinfo.wait[W_SWAP]; cpu_stats_buf->context_switches += (long long)cs.cpu_sysinfo.pswitch; cpu_stats_buf->syscalls += (long long)cs.cpu_sysinfo.syscall; cpu_stats_buf->involuntary_context_switches += (long long)cs.cpu_sysinfo.inv_swtch; cpu_stats_buf->interrupts += (long long)cs.cpu_sysinfo.intr; /* cpu_stats_buf->soft_interrupts += (long long)cs.cpu_sysinfo.? trap?; */ } cpu_stats_buf->total = cpu_stats_buf->user + cpu_stats_buf->iowait + cpu_stats_buf->kernel + cpu_stats_buf->idle + cpu_stats_buf->swap; cpu_stats_buf->voluntary_context_switches = cpu_stats_buf->context_switches - cpu_stats_buf->involuntary_context_switches; kstat_close(kc); #elif defined(LINUX) || defined(CYGWIN) if ((f=fopen("/proc/stat", "r" ))==NULL) { RETURN_WITH_SET_ERROR_WITH_ERRNO("cpu", SG_ERROR_OPEN, "/proc/stat"); } while( ( fgets(line, sizeof(line), f) != NULL ) && (matched < 4) ) { if( ( ( strncmp( line, "cpu", strlen("cpu" ) ) == 0 ) && isblank(line[strlen("cpu")]) ) ) { /* The very first line should be cpu */ proc_stat_cpu = sscanf(line, "cpu %llu %llu %llu %llu %llu", &cpu_stats_buf->user, &cpu_stats_buf->nice, &cpu_stats_buf->kernel, &cpu_stats_buf->idle, &cpu_stats_buf->iowait); if (proc_stat_cpu < 4 || proc_stat_cpu > 5) { RETURN_WITH_SET_ERROR("cpu", SG_ERROR_PARSE, "cpu"); } ++matched; } else if( ( ( strncmp( line, "intr", strlen("intr" ) ) == 0 ) && isblank(line[strlen("intr")]) ) ) { proc_stat_cpu = sscanf(line, "intr %llu", &cpu_stats_buf->interrupts); if (proc_stat_cpu != 1) { RETURN_WITH_SET_ERROR("cpu", SG_ERROR_PARSE, "intr"); } ++matched; } else if( ( ( strncmp( line, "ctxt", strlen("ctxt" ) ) == 0 ) && isblank(line[strlen("ctxt")]) ) ) { proc_stat_cpu = sscanf(line, "ctxt %llu", &cpu_stats_buf->context_switches); if (proc_stat_cpu != 1) { RETURN_WITH_SET_ERROR("cpu", SG_ERROR_PARSE, "ctxt"); } ++matched; } else if( ( ( strncmp( line, "softirq", strlen("softirq" ) ) == 0 ) && isblank(line[strlen("softirq")]) ) ) { proc_stat_cpu = sscanf(line, "softirq %llu", &cpu_stats_buf->soft_interrupts); if (proc_stat_cpu != 1) { RETURN_WITH_SET_ERROR("cpu", SG_ERROR_PARSE, "softirq"); } ++matched; } } fclose(f); cpu_stats_buf->total = cpu_stats_buf->user + cpu_stats_buf->nice + cpu_stats_buf->kernel + cpu_stats_buf->idle; #elif defined(ALLBSD) # if defined(HAVE_HOST_STATISTICS) || defined(HAVE_HOST_STATISTICS64) self_host_port = mach_host_self(); if( (rc = host_statistics(self_host_port, HOST_CPU_LOAD_INFO, (host_info_t)(&cpustats), &count)) != KERN_SUCCESS ) { RETURN_WITH_SET_ERROR_WITH_ERRNO_CODE( "cpu", SG_ERROR_MACHCALL, rc, "host_statistics" ); } cpu_stats_buf->user = cpustats.cpu_ticks[CPU_STATE_USER]; cpu_stats_buf->nice = cpustats.cpu_ticks[CPU_STATE_NICE]; cpu_stats_buf->kernel = cpustats.cpu_ticks[CPU_STATE_SYSTEM]; cpu_stats_buf->idle = cpustats.cpu_ticks[CPU_STATE_IDLE]; cpu_stats_buf->total = cpu_stats_buf->user + cpu_stats_buf->nice + cpu_stats_buf->kernel + cpu_stats_buf->idle; # elif defined(HAVE_STRUCT_KINFO_CPUTIME) && defined(HAVE_KINFO_GET_SCHED_CPUTIME) if( (rc = kinfo_get_sched_cputime( &cpu_time ) ) != 0 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO( "cpu", SG_ERROR_SYSCTL, "kern.cputime" ); } cpu_stats_buf->user = cpu_time.cp_user; cpu_stats_buf->nice = cpu_time.cp_nice; cpu_stats_buf->kernel = cpu_time.cp_sys; cpu_stats_buf->kernel += cpu_time.cp_intr; cpu_stats_buf->idle = cpu_time.cp_idle; cpu_stats_buf->total = cpu_stats_buf->user + cpu_stats_buf->nice + cpu_stats_buf->kernel + cpu_stats_buf->idle; # else /* FIXME probably better rewrite and use sysctlgetmibinfo * or sysctl( {0, 4, ...}, ... ) to know surely returned item size */ size = sizeof(cp_time); if (sysctl(mib, 2, &cp_time, &size, NULL, 0) < 0) { RETURN_WITH_SET_ERROR_WITH_ERRNO("cpu", SG_ERROR_SYSCTL, # if defined(KERN_CPTIME) "CTL_KERN.KERN_CPTIME" # elif defined(KERN_CP_TIME) "CTL_KERN.KERN_CP_TIME" # else "nametomib(kern.cp_time)" # endif ); } /* XXX clock ticks! */ cpu_stats_buf->user=cp_time[CP_USER]; cpu_stats_buf->nice=cp_time[CP_NICE]; cpu_stats_buf->kernel=cp_time[CP_SYS]; cpu_stats_buf->idle=cp_time[CP_IDLE]; cpu_stats_buf->total = 0; for( size = 0; size < CPUSTATES; ++size ) cpu_stats_buf->total += cp_time[size]; # endif # if defined(VM_UVMEXP2) && defined(HAVE_STRUCT_UVMEXP_SYSCTL) /* read: NetBSD */ mib[0] = CTL_VM; mib[1] = VM_UVMEXP2; size = sizeof(uvmexp); if( sysctl( mib, 2, &uvmexp, &size, NULL, 0 ) < 0 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("cpu", SG_ERROR_SYSCTL, "CTL_VM.VM_UVMEXP2" ); } cpu_stats_buf->context_switches = uvmexp.swtch; cpu_stats_buf->syscalls = uvmexp.syscalls; cpu_stats_buf->voluntary_context_switches = cpu_stats_buf->involuntary_context_switches = 0; cpu_stats_buf->interrupts = uvmexp.intrs; cpu_stats_buf->soft_interrupts = uvmexp.softs; # elif defined(VM_UVMEXP) && defined(HAVE_STRUCT_UVMEXP_SWTCH) /* read: OpenBSD */ mib[0] = CTL_VM; mib[1] = VM_UVMEXP; size = sizeof(uvmexp); if( sysctl( mib, 2, &uvmexp, &size, NULL, 0 ) < 0 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("cpu", SG_ERROR_SYSCTL, "CTL_VM.VM_UVMEXP" ); } cpu_stats_buf->context_switches = uvmexp.swtch; cpu_stats_buf->syscalls = uvmexp.syscalls; cpu_stats_buf->voluntary_context_switches = cpu_stats_buf->involuntary_context_switches = 0; cpu_stats_buf->interrupts = uvmexp.intrs; cpu_stats_buf->soft_interrupts = uvmexp.softs; # elif defined(HAVE_STRUCT_VMMETER) && defined(VM_METER) mib[0] = CTL_VM; mib[1] = VM_METER; size = sizeof(vmmeter); memset(&vmmeter, 0, sizeof(vmmeter)); if( (sysctl( mib, 2, &vmmeter, &size, NULL, 0 ) == 0) && (size == sizeof(vmmeter)) ) { cpu_stats_buf->context_switches = vmmeter.v_swtch; cpu_stats_buf->syscalls = vmmeter.v_syscall; cpu_stats_buf->syscalls += vmmeter.v_trap; cpu_stats_buf->voluntary_context_switches = cpu_stats_buf->involuntary_context_switches = 0; cpu_stats_buf->interrupts = vmmeter.v_intr; cpu_stats_buf->soft_interrupts = vmmeter.v_soft; } else { cpu_stats_buf->context_switches = 0; cpu_stats_buf->syscalls = 0; cpu_stats_buf->voluntary_context_switches = cpu_stats_buf->involuntary_context_switches = 0; cpu_stats_buf->interrupts = 0; cpu_stats_buf->soft_interrupts = 0; } # else cpu_stats_buf->context_switches = 0; cpu_stats_buf->syscalls = 0; cpu_stats_buf->voluntary_context_switches = cpu_stats_buf->involuntary_context_switches = 0; cpu_stats_buf->interrupts = 0; cpu_stats_buf->soft_interrupts = 0; # endif #else cpu_stats_buf->systime = 0; RETURN_WITH_SET_ERROR("cpu", SG_ERROR_UNSUPPORTED, OS_TYPE); #endif cpu_stats_buf->systime=time(NULL); return SG_ERROR_NONE; } VECTOR_INIT_INFO_EMPTY_INIT(sg_cpu_stats); EASY_COMP_ACCESS(sg_get_cpu_stats,cpu,cpu,SG_CPU_NOW_IDX) static unsigned long long counter_diff(unsigned long long new, unsigned long long old){ # if (defined(VM_UVMEXP2) && defined(HAVE_STRUCT_UVMEXP_SYSCTL)) || /* read: NetBSD */ \ (defined(VM_UVMEXP) && defined(HAVE_STRUCT_UVMEXP_SWTCH)) /* read: OpenBSD */ /* 64-bit quantities, so plain subtraction works. */ return new - old; # elif defined(HAVE_STRUCT_VMMETER) && defined(VM_METER) /* probably 32-bit quantities, so we must explicitly deal with wraparound. */ if( new >= old ) { return new - old; } else { unsigned long long retval = INT_MAX; ++retval; retval += new; retval -= old; return retval; } #else /* 64-bit quantities, so plain subtraction works. */ return new - old; #endif } static sg_error sg_get_cpu_stats_diff_int(sg_cpu_stats *tgt, const sg_cpu_stats *now, const sg_cpu_stats *last){ if( NULL == tgt ) { RETURN_WITH_SET_ERROR("cpu", SG_ERROR_INVALID_ARGUMENT, "sg_get_cpu_stats_diff_int(tgt)"); } if( now ) { *tgt = *now; if( last ) { tgt->user -= last->user; tgt->kernel -= last->kernel; tgt->idle -= last->idle; tgt->iowait -= last->iowait; tgt->swap -= last->swap; tgt->nice -= last->nice; tgt->total -= last->total; tgt->context_switches = counter_diff( tgt->context_switches, last->context_switches ); tgt->voluntary_context_switches = counter_diff( tgt->voluntary_context_switches, last->voluntary_context_switches ); tgt->involuntary_context_switches = counter_diff( tgt->involuntary_context_switches, last->involuntary_context_switches ); tgt->syscalls = counter_diff( tgt->syscalls, last->syscalls ); tgt->interrupts = counter_diff( tgt->interrupts, last->interrupts ); tgt->soft_interrupts = counter_diff( tgt->soft_interrupts, last->soft_interrupts ); tgt->systime -= last->systime; } } else { memset( tgt, 0, sizeof(*tgt) ); } return SG_ERROR_NONE; } EASY_COMP_DIFF(sg_get_cpu_stats_diff,sg_get_cpu_stats,cpu,cpu,SG_CPU_DIFF_IDX,SG_CPU_NOW_IDX) VECTOR_INIT_INFO_EMPTY_INIT(sg_cpu_percents); static sg_error sg_get_cpu_percents_int(sg_cpu_percents *cpu_percent_buf, const sg_cpu_stats *cpu_stats_buf){ cpu_percent_buf->user = ((double)cpu_stats_buf->user) / ((double)cpu_stats_buf->total) * 100; cpu_percent_buf->kernel = ((double)cpu_stats_buf->kernel) / ((double)cpu_stats_buf->total) * 100; cpu_percent_buf->idle = ((double)cpu_stats_buf->idle) / ((double)cpu_stats_buf->total) * 100; cpu_percent_buf->iowait = ((double)cpu_stats_buf->iowait) / ((double)cpu_stats_buf->total) * 100; cpu_percent_buf->swap = ((double)cpu_stats_buf->swap) / ((double)cpu_stats_buf->total) * 100; cpu_percent_buf->nice = ((double)cpu_stats_buf->nice) / ((double)cpu_stats_buf->total) * 100; cpu_percent_buf->time_taken = cpu_stats_buf->systime; return SG_ERROR_NONE; } #if 0 /* this is nonsense - according to the documentation at * http://support.microsoft.com/kb/262938 is it possible for other * applications to read the same global counter and reset the the * measure points. * * better take a look to * - http://technet.microsoft.com/en-us/library/cc737309%28WS.10%29.aspx * - SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION at * http://msdn.microsoft.com/en-us/library/ms724509%28VS.85%29.aspx * It's unlikely that this API will be removed before full replacement * API is available. */ #ifdef WIN32 double result; if(read_counter_double(SG_WIN32_PROC_USER, &result)) { sg_set_error(SG_ERROR_PDHREAD, PDH_USER); return NULL; } cpu_usage->user = (float)result; if(read_counter_double(SG_WIN32_PROC_PRIV, &result)) { sg_set_error(SG_ERROR_PDHREAD, PDH_PRIV); return NULL; } cpu_usage->kernel = (float)result; if(read_counter_double(SG_WIN32_PROC_IDLE, &result)) { sg_set_error(SG_ERROR_PDHREAD, PDH_IDLE); return NULL; } /* win2000 does not have an idle counter, but does have %activity * so convert it to idle */ cpu_usage->idle = 100 - (float)result; if(read_counter_double(SG_WIN32_PROC_INT, &result)) { sg_set_error(SG_ERROR_PDHREAD, PDH_INTER); return NULL; } cpu_usage->iowait = (float)result; return SG_ERROR_NONE; #endif #endif sg_cpu_percents * sg_get_cpu_percents_of(sg_cpu_percent_source cps, size_t *entries) { struct sg_cpu_glob *cpu_glob = GLOBAL_GET_TLS(cpu); sg_vector *cpu_stats_vector = NULL; /* to avoid wrong warning */ sg_cpu_stats *cs_ptr = NULL; sg_cpu_percents *cpu_usage; TRACE_LOG("cpu", "entering sg_get_cpu_percents_of"); if( !cpu_glob ) { /* assuming error comp can't neither */ ERROR_LOG("cpu", "sg_get_cpu_percents_of failed - cannot get glob"); return NULL; } if( !cpu_glob->cpu_vectors[SG_CPU_PERCENT_IDX] ) cpu_glob->cpu_vectors[SG_CPU_PERCENT_IDX] = sg_vector_create(1, 1, 1, & VECTOR_INIT_INFO(sg_cpu_percents)); if( !cpu_glob->cpu_vectors[SG_CPU_PERCENT_IDX] ) { sg_set_error_fmt(SG_ERROR_MALLOC, "sg_get_cpu_percents_of"); ERROR_LOG_FMT("cpu", "sg_get_cpu_percents_of failed with %s", sg_str_error(SG_ERROR_MALLOC)); return NULL; } cpu_usage = VECTOR_DATA(cpu_glob->cpu_vectors[SG_CPU_PERCENT_IDX]); switch(cps) { case sg_entire_cpu_percent: cpu_stats_vector = cpu_glob->cpu_vectors[SG_CPU_NOW_IDX]; if( !cpu_stats_vector ) cs_ptr = sg_get_cpu_stats(NULL); break; case sg_last_diff_cpu_percent: cpu_stats_vector = cpu_glob->cpu_vectors[SG_CPU_DIFF_IDX]; if( cpu_stats_vector ) break; /* else fallthrough */ case sg_new_diff_cpu_percent: cs_ptr = sg_get_cpu_stats_diff(NULL); break; default: SET_ERROR("cpu", SG_ERROR_INVALID_ARGUMENT, "sg_get_cpu_percents_of(cps = %d)", (int)cps); break; } if( !cpu_stats_vector && !cs_ptr ) { ERROR_LOG_FMT("cpu", "sg_get_cpu_percents_of failed with %s", sg_str_error(sg_get_error())); if(entries) *entries = 0; return NULL; /* error should been set by called subroutine */ } if( cpu_stats_vector && !cs_ptr ) cs_ptr = VECTOR_DATA(cpu_stats_vector); if( SG_ERROR_NONE == sg_get_cpu_percents_int(cpu_usage, cs_ptr) ) { TRACE_LOG("cpu", "sg_get_cpu_percents_of succeded"); \ if(entries) *entries = VECTOR_ITEM_COUNT(cpu_stats_vector); return cpu_usage; } WARN_LOG_FMT("cpu", "sg_get_cpu_percents_of failed with %s", sg_str_error(sg_get_error())); if(entries) *entries = 0; return NULL; } sg_cpu_percents * sg_get_cpu_percents_r(sg_cpu_stats const * whereof, size_t *entries) { sg_vector *cpu_percents_result_vector; sg_cpu_percents *cpu_usage; TRACE_LOG("cpu", "entering sg_get_cpu_percents_r"); if( NULL == whereof ) { SET_ERROR("cpu", SG_ERROR_INVALID_ARGUMENT, "sg_get_cpu_percents_r(whereof = %p)", whereof); if(entries) *entries = 0; return NULL; } cpu_percents_result_vector = sg_vector_create(1, 1, 1, & VECTOR_INIT_INFO(sg_cpu_percents)); if( NULL == cpu_percents_result_vector ) { ERROR_LOG_FMT("cpu", "sg_get_cpu_percents_r failed with %s", sg_str_error(sg_get_error())); if(entries) *entries = 0; return NULL; } cpu_usage = VECTOR_DATA(cpu_percents_result_vector); if( SG_ERROR_NONE == sg_get_cpu_percents_int(cpu_usage, whereof) ) { TRACE_LOG("cpu", "sg_get_cpu_percents_r succeded"); if(entries) *entries = VECTOR_ITEM_COUNT(cpu_percents_result_vector); return cpu_usage; } WARN_LOG_FMT("cpu", "sg_get_cpu_percents_r failed with %s", sg_str_error(sg_get_error())); sg_vector_free(cpu_percents_result_vector); if(entries) *entries = 0; return NULL; } libstatgrab-0.90/src/libstatgrab/tools.h000644 001750 001750 00000027103 12200025312 020300 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #ifndef STATGRAB_TOOLS_H #define STATGRAB_TOOLS_H #ifdef HAVE_CONFIG_H #include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #include #ifdef STDC_HEADERS # include # include # include # include # include # include # include # include # include # include # include # include # include #else # ifdef HAVE_FLOAT_H # include # endif # ifdef HAVE_LOCALE_H # include # endif # ifdef HAVE_MATH_H # include # endif # ifdef HAVE_SETJMP_H # include # endif # ifdef HAVE_STDARG_H # include # endif # ifdef HAVE_CTYPE_H # include # endif # ifdef HAVE_SIGNAL_H # include # endif # ifdef HAVE_ERRNO_H # include # endif # ifdef HAVE_LIMITS_H # include # endif # ifdef HAVE_ASSERT_H # include # endif # ifdef HAVE_STDDEF_H # include # endif # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDBOOL_H # include #else # ifndef HAVE__BOOL # ifdef __cplusplus typedef bool _Bool; # else # define _Bool signed char # endif # endif # define bool _Bool # define false 0 # define true 1 # define __bool_true_false_are_defined 1 #endif #ifdef HAVE_UNISTD_H # include #elif defined(HAVE_SYS_UNISTD_H) # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef TIME_WITH_SYS_TIME # include # include #else # ifdef HAVE_SYS_TIME_H # include # else # include # endif #endif #ifdef HAVE_FCNTL_H # include #endif #ifdef HAVE_DIRENT_H # include # define NAMLEN(dirent) strlen ((dirent)->d_name) #else # define dirent direct # define NAMLEN(dirent) ((dirent)->d_namlen) # ifdef HAVE_SYS_NDIR_H # include # endif # ifdef HAVE_SYS_DIR_H # include # endif # ifdef HAVE_NDIR_H # include # endif #endif #ifdef HAVE_LIBGEN_H # include #endif #ifdef _WIN32 # ifdef HAVE_WINSOCK2_H # include # if HAVE_WS2TCPIP_H # include # endif # if HAVE_WSPIAPI_H # include # endif # elif defined(HAVE_WINSOCK_H) /* IIRC winsock.h must be included before windows.h */ # include # endif # ifdef HAVE_IO_H # include # endif # ifdef HAVE_PSAPI_H # include # endif # ifdef HAVE_PROCESS_H # include # endif # include # ifdef HAVE_PDH_H # include # endif # ifdef HAVE_IPHLPAPI_H # include # endif # ifdef HAVE_LM_H # include # endif # include "win32.h" #else # ifdef HAVE_SYS_SOCKET_H # include # endif # ifdef HAVE_NETINET_IN_H # include # endif # ifdef HAVE_NETDB_H # include # endif # ifdef HAVE_ARPA_INET_H # include # endif # ifdef HAVE_NET_IF_H # include # endif #endif #if 0 #ifndef HAVE_STRCASECMP # ifdef HAVESTRICMP # define strcasecmp stricmp # else extern "C" strcasecmp(const char *s1, const char *s2); # endif #endif #endif #ifndef HAVE_GETPID # ifdef HAVE__GETPID # define getpid _getpid # endif #endif #ifndef HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY # ifdef HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY # define ss_family __ss_family # endif #endif #ifdef HAVE_PTHREAD_H # include #endif #if HAVE_REGEX_H # include #endif #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_USER_H # include #endif #ifdef HAVE_SYS_PROC_H # include #endif #ifdef HAVE_UVM_UVM_H # include #endif #ifdef HAVE_SYS_VMMETER_H #include #endif #ifdef HAVE_SYS_PSTAT_H # include #endif #ifdef HAVE_SYS_SAR_H # include #endif #ifdef HAVE_SYS_SYSINFO_H # include #endif #ifdef HAVE_SYS_SYSCTL_H # include #endif #ifdef HAVE_SYS_LOADAVG_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_SYS_STATVFS_H # include #endif #ifdef HAVE_KSTAT_H # include #endif #ifdef HAVE_PROCFS_H # include #endif #ifdef HAVE_SYS_DR_H # include #endif #ifdef HAVE_SYS_PROTOSW_H # include #endif #ifdef HAVE_LIBPERFSTAT_H # include #endif #ifdef HAVE_PROCINFO_H # include #endif #ifdef HAVE_SYS_DK_H # include #endif #ifdef HAVE_SYS_DKSTAT_H # include #endif #ifdef HAVE_SCHED_H # include #endif #ifdef HAVE_SYS_SCHED_H # include #endif #ifdef HAVE_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTENT_H # include #endif #ifdef HAVE_SYS_MNTTAB_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_SYS_VFS_H # include #endif #ifdef HAVE_SYS_UCRED_H # include #endif #ifdef HAVE_VM_VM_PARAM_H # include #endif #ifdef HAVE_SYS_MOUNT_H # include #endif #ifdef HAVE_SYS_RESOURCE_H # include #endif #ifdef HAVE_DEVSTAT_H # include #endif #ifdef HAVE_SYS_DISK_H # include #endif #ifdef HAVE_SYS_IOSTAT_H #include #endif #ifdef HAVE_FSTAB_H # include #endif #ifdef HAVE_SYS_STATFS_H # include #endif #ifdef HAVE_SYS_MNTCTL_H # include #endif #ifdef HAVE_SYS_VMOUNT_H # include #endif #ifdef HAVE_SYS_IOCTL_H # include #endif #ifdef HAVE_SYS_SOCKIO_H # include #endif #ifdef LINUX_BROKEN_ETHTOOL_TYPES # define __u8 uint8_t # define __u16 uint16_t # define __u32 uint32_t # define __u64 uint64_t # include # undef __u8 # undef __u16 # undef __u32 # undef __u64 #endif #ifdef HAVE_LINUX_ETHTOOL_H # include #endif #ifdef HAVE_LINUX_SOCKIOS_H # include #endif #ifdef HAVE_IFADDRS_H # include #endif #ifdef HAVE_NET_IF_MEDIA_H # include #endif #ifdef HAVE_SYS_UN_H # include #endif #ifdef HAVE_SYS_STROPTS_H # include #endif #ifdef HAVE_SYS_DLPI_H # include #endif #ifdef HAVE_SYS_DLPI_EXT_H # include #endif #ifdef HAVE_SYS_MIB_H # include #endif #ifdef HAVE_SYS_UTSNAME_H # include #endif #ifdef HAVE_SYS_SWAP_H # include #endif #ifdef HAVE_SYS_FSTYP_H # include #endif #if defined(HAVE_UTMPX_H) # include #endif #if defined(HAVE_UTMP_H) # include #endif #ifdef HAVE_LIBDEVINFO_H # include #endif #ifdef HAVE_MACH_MACH_H # include #else # ifdef HAVE_MACH_MACHINE_H # include # endif # ifdef HAVE_MACH_MACH_HOST_H # include # endif # ifdef HAVE_MACH_VM_STATISTICS_H # include # endif # ifdef HAVE_MACH_KERN_RETURN_H # include # endif # ifdef HAVE_MACH_HOST_INFO_H # include # endif #endif #ifdef HAVE_KINFO_H # include #endif #ifdef HAVE_SYS_SYSTEMINFO_H # include #endif #include "statgrab.h" #ifndef lengthof #define lengthof(x) (sizeof(x)/sizeof((x)[0])) #endif #if defined(__ICC) && defined(offsetof) # undef offsetof #endif #ifndef offsetof # ifdef __ICC # define offsetof(type,memb) ((size_t)(((char *)(&((type*)0)->memb)) - ((char *)0))) # else # define offsetof(type,memb) ((size_t)(((char *)(&((type*)0)->memb)) - ((char *)0))) # endif #endif #define MAGIC_EYE(a,b,c,d) (((unsigned)(a) & 0xFF) + (((unsigned)(b) & 0xFF) << 8) + (((unsigned)(c) & 0xFF) << 16) + (((unsigned)(d) & 0xFF) << 24)) #ifndef MIN #define MIN(a,b) ((a) < (b) ? (a) : (b)) #endif #ifndef MAX #define MAX(a,b) ((a) > (b) ? (a) : (b)) #endif #include "trace.h" #ifdef SOLARIS __sg_private const char *sg_get_svr_from_bsd(const char *bsd); #endif #if !defined(HAVE_FLOCK) && defined(HAVE_FCNTL) && defined(HAVE_DECL_F_SETLK) __sg_private int flock(int fd, int op); # ifndef LOCK_SH # define LOCK_SH 1 # endif # ifndef LOCK_EX # define LOCK_EX 2 # endif # ifndef LOCK_UN # define LOCK_UN 3 # endif # ifndef LOCK_NB # define LOCK_NB 8 # endif #endif #if (defined(HAVE_GETMNTENT) || defined(HAVE_GETMNTENT_R) ) # if !defined(HAVE_DECL_SETMNTENT) || !defined(HAVE_DECL_ENDMNTENT) __sg_private FILE *setmntent(const char *fn, const char *type); __sg_private int endmntent(FILE *f); # endif #endif #ifndef HAVE_STRLCAT __sg_export size_t sg_strlcat(char *dst, const char *src, size_t siz); #else #define sg_strlcat strlcat #endif #ifndef HAVE_STRLCPY __sg_export size_t sg_strlcpy(char *dst, const char *src, size_t siz); #else #define sg_strlcpy strlcpy #endif #if defined(HAVE_STRNLEN) || (defined(HAVE_XOPEN_SOURCE) && (HAVE_XOPEN_SOURCE>=700)) #define sg_strnlen strnlen #else __sg_export size_t sg_strnlen(char const *s, size_t maxlen); #endif #include "error.h" #include "vector.h" #include "globals.h" __sg_private sg_error sg_update_string(char **dest, const char *src); __sg_private sg_error sg_lupdate_string(char **dest, const char *src, size_t maxlen); __sg_private sg_error sg_update_mem(void **dest, const void *src, size_t len); __sg_private sg_error sg_concat_string(char **dest, const char *src); #if defined(LINUX) || defined(CYGWIN) __sg_private long long sg_get_ll_match(char *line, regmatch_t *match); __sg_private char *sg_get_string_match(char *line, regmatch_t *match); __sg_private char *sg_f_read_line(FILE *f, char *linebuf, size_t buf_size, const char *string); #endif #if defined(__NEED_SG_GET_SYS_PAGE_SIZE) static ssize_t sys_page_size; static inline ssize_t sg_get_sys_page_size(void) { if( 0 == sys_page_size ) { if( ( sys_page_size = sysconf(_SC_PAGESIZE) ) == -1 ) { SET_ERROR_WITH_ERRNO("tools", SG_ERROR_SYSCONF, "_SC_PAGESIZE"); } } return sys_page_size; } #endif __sg_private void *sg_realloc(void *ptr, size_t size); #define sg_malloc(size) sg_realloc(NULL, size) #define BITS_PER_ITEM(vect) \ (8*sizeof((vect)[0])) #define BIT_SET(vect,bit) \ (vect)[ (bit) / BITS_PER_ITEM(vect) ] |= ( 1 << ( (bit) % BITS_PER_ITEM(vect) ) ) #define BIT_ISSET(vect,bit) \ ( 0 != ( (vect)[ (bit) / BITS_PER_ITEM(vect) ] & ( 1 << ( (bit) % BITS_PER_ITEM(vect) ) ) ) ) #define BIT_GET(vect,bit) \ ( ( (vect)[ (bit) / BITS_PER_ITEM(vect) ] & ( 1 << ( (bit) % BITS_PER_ITEM(vect) ) ) ) >> ( (bit) % BITS_PER_ITEM(vect) ) ) #define BIT_SCAN_FWD(vect,bit) \ while( 0 == BIT_ISSET(vect,bit) ) ++(bit) #endif /* ?STATGRAB_TOOLS_H */ libstatgrab-0.90/src/libstatgrab/globals.c000644 001750 001750 00000036213 12200025312 020560 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #include "tools.h" struct sg_comp_info { const struct sg_comp_init * const init_comp; size_t glob_ofs; }; extern const struct sg_comp_init sg_cpu_init; extern const struct sg_comp_init sg_disk_init; extern const struct sg_comp_init sg_error_init; extern const struct sg_comp_init sg_load_init; extern const struct sg_comp_init sg_mem_init; extern const struct sg_comp_init sg_network_init; extern const struct sg_comp_init sg_os_init; extern const struct sg_comp_init sg_page_init; extern const struct sg_comp_init sg_process_init; extern const struct sg_comp_init sg_swap_init; extern const struct sg_comp_init sg_user_init; static struct sg_comp_info comp_info[] = { /* error must be the first component to initialize - to hold * the errors for later coming ones */ { &sg_error_init, 0 }, { &sg_cpu_init, 0 }, { &sg_disk_init, 0 }, { &sg_load_init, 0 }, { &sg_mem_init, 0 }, { &sg_network_init, 0 }, { &sg_os_init, 0 }, { &sg_page_init, 0 }, { &sg_process_init, 0 }, { &sg_swap_init, 0 }, { &sg_user_init, 0 }, }; #define GLOB_MASK MAGIC_EYE('g','l','o','b') static size_t glob_size = 0; static void *sg_alloc_globals(void); static void sg_destroy_globals(void *); static void sg_destroy_main_globals(void); #ifdef ENABLE_THREADS # if defined(HAVE_PTHREAD) # include static pthread_key_t glob_key; # ifdef NEED_PTHREAD_ONCE_INIT_BRACES static pthread_once_t once_control = { PTHREAD_ONCE_INIT }; # else static pthread_once_t once_control = PTHREAD_ONCE_INIT; # endif # elif defined(_WIN32) # include static DWORD glob_tls_idx = TLS_OUT_OF_INDEXES; # else # error unsupport thread library # endif # if defined(HAVE_PTHREAD) struct sg_named_mutex { const char *name; pthread_mutex_t mutex; }; # ifdef NEED_PTHREAD_MUTEX_INITIALIZER_BRACES static struct sg_named_mutex glob_lock = { "statgrab", { PTHREAD_MUTEX_INITIALIZER } }; # else static struct sg_named_mutex glob_lock = { "statgrab", PTHREAD_MUTEX_INITIALIZER }; # endif static struct sg_named_mutex *required_locks = NULL; static size_t num_required_locks = 0; static unsigned initialized = 0; static int cmp_named_locks( const void *va, const void *vb ) { const struct sg_named_mutex *a = va, *b = vb; assert( a->name ); assert( b->name ); return strcmp( a->name, b->name ); } sg_error sg_lock_mutex(const char *mutex_name) { struct sg_named_mutex *found; int rc; found = bsearch( &mutex_name, required_locks, num_required_locks, sizeof(required_locks[0]), cmp_named_locks ); if( NULL == found ) { ERROR_LOG_FMT("globals", "Can't find mutex '%s' to be locked ...", mutex_name); RETURN_WITH_SET_ERROR( "globals", SG_ERROR_INVALID_ARGUMENT, mutex_name ); } TRACE_LOG_FMT("globals", "going to lock mutex '%s' for thread %p", mutex_name, (void *)(pthread_self())); rc = pthread_mutex_lock( &found->mutex ); if( 0 != rc ) { RETURN_WITH_SET_ERROR_WITH_ERRNO_CODE("globals", SG_ERROR_MUTEX_LOCK, rc, "error %d locking mutex '%s' for thread %p", rc, mutex_name, (void *)(pthread_self())); } TRACE_LOG_FMT("globals", "mutex '%s' locked for thread %p", mutex_name, (void *)(pthread_self())); return SG_ERROR_NONE; } sg_error sg_unlock_mutex(const char *mutex_name) { struct sg_named_mutex *found; int rc; found = bsearch( &mutex_name, required_locks, num_required_locks, sizeof(required_locks[0]), cmp_named_locks ); if( NULL == found ) { ERROR_LOG_FMT("globals", "Can't find mutex '%s' to be unlocked ...", mutex_name); RETURN_WITH_SET_ERROR( "globals", SG_ERROR_INVALID_ARGUMENT, mutex_name ); } TRACE_LOG_FMT("globals", "going to unlock mutex '%s' in thread %p", mutex_name, (void *)(pthread_self())); rc = pthread_mutex_unlock( &found->mutex ); if( 0 != rc ) { RETURN_WITH_SET_ERROR_WITH_ERRNO_CODE("globals", SG_ERROR_MUTEX_LOCK, rc, "error %d unlocking mutex '%s' in thread %p", rc, mutex_name, (void *)(pthread_self())); } TRACE_LOG_FMT("globals", "mutex '%s' unlocked in thread %p", mutex_name, (void *)(pthread_self())); return SG_ERROR_NONE; } sg_error sg_global_lock(void) { int rc; TRACE_LOG_FMT("globals", "going to lock mutex 'statgrab' for thread %p", (void *)(pthread_self())); rc = pthread_mutex_lock( &glob_lock.mutex ); if( 0 != rc ) { RETURN_WITH_SET_ERROR_WITH_ERRNO_CODE("globals", SG_ERROR_MUTEX_LOCK, rc, "error %d locking mutex '%s' in thread %p", rc, "statgrab", (void *)(pthread_self())); } TRACE_LOG_FMT("globals", "mutex 'statgrab' locked for thread %p", (void *)(pthread_self())); return SG_ERROR_NONE; } sg_error sg_global_unlock(void) { int rc; TRACE_LOG_FMT("globals", "going to unlock mutex 'statgrab' for thread %p", (void *)(pthread_self())); rc = pthread_mutex_unlock( &glob_lock.mutex ); if( 0 != rc ) { RETURN_WITH_SET_ERROR_WITH_ERRNO_CODE("globals", SG_ERROR_MUTEX_LOCK, rc, "error %d unlocking mutex '%s' in thread %p", rc, "statgrab", (void *)(pthread_self())); } TRACE_LOG_FMT("globals", "mutex 'statgrab' unlocked for thread %p", (void *)(pthread_self())); return SG_ERROR_NONE; } static void sg_first_init(void) { pthread_mutexattr_t attr; int rc; rc = pthread_key_create(&glob_key, sg_destroy_globals); if( 0 != rc ) abort(); // can't store error state without TLS rc = pthread_mutexattr_init(&attr); if( 0 != rc ) abort(); rc = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK); if( 0 != rc ) abort(); rc = pthread_mutex_init(&glob_lock.mutex, NULL); if( 0 != rc ) abort(); // can't store error state without TLS } # endif static sg_error sg_init_thread_local(void) { # if defined(HAVE_PTHREAD) if( 0 != pthread_once(&once_control, sg_first_init) ) abort(); // can't store error state without TLS # elif defined(_WIN32) if( ( TLS_OUT_OF_INDEXES == glob_tls_idx ) && ( ( glob_tls_idx = TlsAlloc()) == TLS_OUT_OF_INDEXES ) ) abort(); // can't store error state without TLS # endif return SG_ERROR_NONE; } #else /* !ENABLE_THREADS */ static char *glob_buf = NULL; #endif /* ?ENABLE_THREADS */ static void sg_destroy_main_globals(void) { #if defined(ENABLE_THREADS) # if defined(HAVE_PTHREAD) char *glob_buf; while( NULL != ( glob_buf = pthread_getspecific(glob_key) ) ) sg_destroy_globals(glob_buf); # elif defined(WIN32) glob_buf = TlsGetValue(glob_tls_idx); if((NULL == glob_buf) && (ERROR_SUCCESS != GetLastError())){ RETURN_WITH_SET_ERROR("globals", SG_ERROR_MEMSTATUS, NULL); } if(glob_buf) sg_destroy_globals(glob_buf); # endif #else if(glob_buf) { sg_destroy_globals(glob_buf); glob_buf = NULL; } #endif } sg_error sg_comp_init(int ignore_init_errors) { size_t i; sg_error errc = SG_ERROR_NONE; TRACE_LOG("globals", "Entering sg_comp_init() ..."); #ifdef ENABLE_THREADS errc = sg_init_thread_local(); if(SG_ERROR_NONE != errc) return errc; sg_global_lock(); if( 0 != initialized++ ) return sg_global_unlock(); #endif atexit((void (*)(void))sg_destroy_main_globals); TRACE_LOG("globals", "Doing sg_comp_init() ..."); glob_size = 0U; for( i = 0; i < lengthof(comp_info); ++i ) { comp_info[i].glob_ofs = glob_size; glob_size += comp_info[i].init_comp->static_buf_size; } TRACE_LOG_FMT("globals", "need " FMT_SIZE_T " bytes tls storage for " FMT_SIZE_T " components", glob_size, i); #if defined(ENABLE_THREADS) && defined(HAVE_PTHREAD) required_locks = sg_malloc( sizeof(required_locks[0]) ); if( NULL == required_locks ) { RETURN_WITH_SET_ERROR("globals", SG_ERROR_MALLOC, "sg_comp_init"); } required_locks[0] = glob_lock; num_required_locks = 1; #endif for( i = 0; i < lengthof(comp_info); ++i ) { #if defined(ENABLE_THREADS) && defined(HAVE_PTHREAD) unsigned mtx_idx, new_mtx_count; struct sg_named_mutex *tmp = NULL; #endif if( comp_info[i].init_comp->init_fn ) { sg_error comp_errc; TRACE_LOG_FMT("globals", "calling init_fn for comp " FMT_SIZE_T, i); comp_errc = comp_info[i].init_comp->init_fn(i + GLOB_MASK); if( comp_errc != SG_ERROR_NONE ) { if( ignore_init_errors && (NULL != comp_info[i].init_comp->status) ) { char *buf = NULL; comp_info[i].init_comp->status->init_error = comp_errc; ERROR_LOG_FMT("globals", "sg_comp_init: comp[" FMT_SIZE_T "].init_fn() fails with '%s'", i, sg_strperror(&buf, NULL)); free(buf); errc = SG_ERROR_INITIALISATION; } else { RETURN_FROM_PREVIOUS_ERROR( "globals", comp_errc ); } } } #if defined(ENABLE_THREADS) && defined(HAVE_PTHREAD) for( mtx_idx = 0, new_mtx_count = 0; comp_info[i].init_comp->required_locks[mtx_idx] != NULL; ++mtx_idx ) { if( NULL != required_locks ) { /* looking whether the required mutex is already known by it's name */ tmp = bsearch( &comp_info[i].init_comp->required_locks[mtx_idx], required_locks, num_required_locks, sizeof(required_locks[0]), cmp_named_locks ); if( NULL != tmp ) continue; /* skip already known ... */ } ++new_mtx_count; } if( 0 == new_mtx_count ) continue; /* to next comp */ tmp = sg_realloc(required_locks, sizeof(required_locks[0]) * (num_required_locks + new_mtx_count) ); if( NULL == tmp ) { RETURN_WITH_SET_ERROR("globals", SG_ERROR_MALLOC, "sg_comp_init"); } required_locks = tmp; mtx_idx = 0; while( comp_info[i].init_comp->required_locks[mtx_idx] != NULL ) { /* looking whether the required mutex is already known by it's name (probably double requirement)) */ tmp = bsearch( &comp_info[i].init_comp->required_locks[mtx_idx], required_locks, num_required_locks, sizeof(required_locks[0]), cmp_named_locks ); if( NULL != tmp ) { ++mtx_idx; continue; } required_locks[num_required_locks++].name = comp_info[i].init_comp->required_locks[mtx_idx++]; /* sort to allow bsearch for next name in loop */ qsort( required_locks, num_required_locks, sizeof(required_locks[0]), cmp_named_locks ); } #endif } #if defined(ENABLE_THREADS) && defined(HAVE_PTHREAD) if( 0U != num_required_locks ) { pthread_mutexattr_t attr; int rc; rc = pthread_mutexattr_init(&attr); if( 0 != rc ) { PANIC_LOG_FMT( "globals", "sg_comp_init: pthread_mutexattr_init() fails with %d", rc ); return SG_ERROR_INITIALISATION; } rc = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); if( 0 != rc ) { PANIC_LOG_FMT( "globals", "sg_comp_init: pthread_mutexattr_settype() fails with %d", rc ); return SG_ERROR_INITIALISATION; } for( i = 0; i < num_required_locks; ++i ) { if( required_locks[i].name != glob_lock.name ) pthread_mutex_init( &required_locks[i].mutex, &attr ); } pthread_mutexattr_destroy(&attr); } #endif #ifdef ENABLE_THREADS sg_global_unlock(); #endif TRACE_LOG_FMT("globals", "%lu components initialized", i); return errc; } sg_error sg_comp_destroy(void) { size_t i = lengthof(comp_info); #ifdef ENABLE_THREADS sg_global_lock(); if( 0 != --initialized ) return sg_global_unlock(); #endif glob_size = 0U; while(i--) { if( NULL != comp_info[i].init_comp->destroy_fn) comp_info[i].init_comp->destroy_fn(); } #if defined(ENABLE_THREADS) && defined(HAVE_PTHREAD) for( i = 0; i < num_required_locks; ++i ) { if( glob_lock.name == required_locks[i].name ) continue; pthread_mutex_destroy(&required_locks[i].mutex); } free( required_locks ); num_required_locks = 0; #endif #ifdef ENABLE_THREADS return sg_global_unlock(); #else return SG_ERROR_NONE; #endif } static void * sg_alloc_globals(void) { #ifdef ENABLE_THREADS void *glob_buf = NULL; # if defined(HAVE_PTHREAD) TRACE_LOG_FMT("globals", "allocating globals for thread %p", (void *)(pthread_self())); # elif defined(WIN32) TRACE_LOG_FMT("globals", "allocating globals for thread %u", GetCurrentThreadId() ); # endif #endif if(0U != glob_size) { # if defined(HAVE_PTHREAD) int rc; #endif glob_buf = malloc(glob_size); if(NULL == glob_buf){ SET_ERROR("globals", SG_ERROR_MALLOC, "sg_alloc_globals: malloc() failed or no components registered"); return NULL; } memset( glob_buf, 0, glob_size ); TRACE_LOG_FMT("globals", "allocated globals zeroed from %p .. %p (" FMT_SIZE_T " bytes)", glob_buf, ((char *)glob_buf) + glob_size, glob_size); #ifdef ENABLE_THREADS # if defined(HAVE_PTHREAD) if( 0 != ( rc = pthread_setspecific(glob_key, glob_buf) ) ) { ERROR_LOG_FMT("globals", "Couldn't set allocated global storage for thread %p: %d", (void *)(pthread_self()), rc ); free( glob_buf ); glob_buf = 0; } else { TRACE_LOG_FMT("globals", "globals for thread %p set to %p", (void *)(pthread_self()), glob_buf); } # elif defined(WIN32) TlsSetValue(glob_tls_idx, glob_buf); // XXX error check! # endif #endif } return glob_buf; } static void sg_destroy_globals(void *glob_buf){ #ifdef ENABLE_THREADS # if defined(HAVE_PTHREAD) TRACE_LOG_FMT("globals", "destroying global storage at %p for thread %p", glob_buf, (void *)(pthread_self())); # elif defined(WIN32) glob_buf = TlsGetValue(glob_tls_idx); TRACE_LOG_FMT("globals", "destroying global storage at %p for thread %u", glob_buf, GetCurrentThreadId() ); // (void)ign; /* to avoid unused parameter warning */ # endif #endif if( glob_buf ) { # if defined(HAVE_PTHREAD) int rc; # endif size_t i = lengthof(comp_info) - 1; size_t zero_size = comp_info[i].glob_ofs + comp_info[i].init_comp->static_buf_size; while(i--) { if(comp_info[i].init_comp->cleanup_fn) comp_info[i].init_comp->cleanup_fn(((char *)glob_buf) + comp_info[i].glob_ofs); } memset( glob_buf, 0, zero_size ); free( glob_buf ); glob_buf = 0; #ifdef ENABLE_THREADS # if defined(HAVE_PTHREAD) if( 0 != ( rc = pthread_setspecific(glob_key, NULL) ) ) { ERROR_LOG_FMT("globals", "Couldn't set freed global storage for thread %p: %d", (void *)(pthread_self()), rc ); } # elif defined(WIN32) // XXX sure? TlsSetValue(glob_tls_idx, NULL); # endif #endif } } void * sg_comp_get_tls(unsigned id) { #ifdef ENABLE_THREADS char *glob_buf; # if defined(HAVE_PTHREAD) glob_buf = pthread_getspecific(glob_key); # elif defined(WIN32) glob_buf = TlsGetValue(glob_tls_idx); if((NULL == glob_buf) && (ERROR_SUCCESS != GetLastError())){ RETURN_WITH_SET_ERROR("globals", SG_ERROR_MEMSTATUS, NULL); } # endif #endif if( NULL == glob_buf ) glob_buf = sg_alloc_globals(); if( /* still */ NULL == glob_buf ) return NULL; /* check sg_error() */ id -= GLOB_MASK; if( id >= lengthof(comp_info) ) { SET_ERROR("globals", SG_ERROR_INVALID_ARGUMENT, "sg_comp_get_tls: invalid id (%u)", id); return NULL; } TRACE_LOG_FMT("globals", "get_global_static(%u): %p", id, glob_buf + comp_info[id].glob_ofs); return glob_buf + comp_info[id].glob_ofs; } libstatgrab-0.90/src/libstatgrab/page_stats.c000644 001750 001750 00000016163 12200025312 021271 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #include "tools.h" #if defined(HAVE_HOST_STATISTICS) || defined(HAVE_HOST_STATISTICS64) static mach_port_t self_host_port; #endif static sg_error sg_get_page_stats_int(sg_page_stats *page_stats_buf){ #ifdef SOLARIS kstat_ctl_t *kc; kstat_t *ksp; cpu_stat_t cs; #elif defined(LINUX) || defined(CYGWIN) FILE *f; #define LINE_BUF_SIZE 256 char line_buf[LINE_BUF_SIZE]; #elif defined(HAVE_HOST_STATISTICS) || defined(HAVE_HOST_STATISTICS64) # if defined(HAVE_HOST_STATISTICS64) struct vm_statistics64 vm_stats; # else struct vm_statistics vm_stats; # endif mach_msg_type_number_t count; kern_return_t rc; #elif defined(HAVE_STRUCT_UVMEXP_SYSCTL) && defined(VM_UVMEXP2) int mib[2]; struct uvmexp_sysctl uvm; size_t size = sizeof(uvm); #elif defined(HAVE_STRUCT_UVMEXP) && defined(VM_UVMEXP) int mib[2]; struct uvmexp uvm; size_t size = sizeof(uvm); #elif defined(FREEBSD) || defined(DFBSD) size_t size; #elif defined(NETBSD) || defined(OPENBSD) int mib[2]; struct uvmexp uvm; size_t size = sizeof(uvm); #elif defined(AIX) perfstat_memory_total_t mem; #elif defined(HPUX) struct pst_vminfo vminfo; #endif page_stats_buf->systime = time(NULL); page_stats_buf->pages_pagein=0; page_stats_buf->pages_pageout=0; #ifdef SOLARIS if ((kc = kstat_open()) == NULL) { RETURN_WITH_SET_ERROR("page", SG_ERROR_KSTAT_OPEN, NULL); } for (ksp = kc->kc_chain; ksp!=NULL; ksp = ksp->ks_next) { if ((strcmp(ksp->ks_module, "cpu_stat")) != 0) continue; if (kstat_read(kc, ksp, &cs) == -1) continue; page_stats_buf->pages_pagein += (long long)cs.cpu_vminfo.pgpgin; page_stats_buf->pages_pageout += (long long)cs.cpu_vminfo.pgpgout; } kstat_close(kc); #elif defined(LINUX) || defined(CYGWIN) if ((f = fopen("/proc/vmstat", "r")) != NULL) { unsigned matches = 0; while( (matches < 2) && (fgets(line_buf, sizeof(line_buf), f) != NULL) ) { unsigned long long value; if (sscanf(line_buf, "%*s %llu", &value) != 1) continue; if (strncmp(line_buf, "pgpgin ", 7) == 0) { page_stats_buf->pages_pagein = value; ++matches; } else if (strncmp(line_buf, "pgpgout ", 8) == 0) { page_stats_buf->pages_pageout = value; ++matches; } } fclose(f); if( matches < 2 ) { RETURN_WITH_SET_ERROR( "page", SG_ERROR_PARSE, "/proc/vmstat" ); } } else if ((f = fopen("/proc/stat", "r")) != NULL) { if (sg_f_read_line(f, line_buf, sizeof(line_buf), "page") == NULL) { fclose(f); RETURN_FROM_PREVIOUS_ERROR( "page", sg_get_error() ); } fclose(f); if( sscanf( line_buf, "page %llu %llu", &page_stats_buf->pages_pagein, &page_stats_buf->pages_pageout ) != 2 ) { RETURN_WITH_SET_ERROR("page", SG_ERROR_PARSE, "page"); } } else { RETURN_WITH_SET_ERROR_WITH_ERRNO("page", SG_ERROR_OPEN, "/proc/stat"); } #elif defined(HAVE_HOST_STATISTICS) || defined(HAVE_HOST_STATISTICS64) self_host_port = mach_host_self(); # if defined(HAVE_HOST_STATISTICS64) count = HOST_VM_INFO64_COUNT; rc = host_statistics64(self_host_port, HOST_VM_INFO64, (host_info64_t)(&vm_stats), &count); # else count = HOST_VM_INFO_COUNT; rc = host_statistics(self_host_port, HOST_VM_INFO, (host_info_t)(&vm_stats), &count); # endif if( rc != KERN_SUCCESS ) { RETURN_WITH_SET_ERROR_WITH_ERRNO_CODE( "mem", SG_ERROR_MACHCALL, rc, "host_statistics" ); } page_stats_buf->pages_pagein = vm_stats.pageins; page_stats_buf->pages_pageout = vm_stats.pageouts; #elif defined(HAVE_STRUCT_UVMEXP_SYSCTL) && defined(VM_UVMEXP2) mib[0] = CTL_VM; mib[1] = VM_UVMEXP2; if (sysctl(mib, 2, &uvm, &size, NULL, 0) < 0) { RETURN_WITH_SET_ERROR_WITH_ERRNO("mem", SG_ERROR_SYSCTL, "CTL_VM.VM_UVMEXP2"); } page_stats_buf->pages_pagein = uvm.pgswapin; page_stats_buf->pages_pageout = uvm.pgswapout; #elif defined(HAVE_STRUCT_UVMEXP) && defined(VM_UVMEXP) mib[0] = CTL_VM; mib[1] = VM_UVMEXP; if (sysctl(mib, 2, &uvm, &size, NULL, 0) < 0) { RETURN_WITH_SET_ERROR_WITH_ERRNO("mem", SG_ERROR_SYSCTL, "CTL_VM.VM_UVMEXP"); } page_stats_buf->pages_pagein = uvm.pgswapin; page_stats_buf->pages_pageout = uvm.pgswapout; #elif defined(FREEBSD) || defined(DFBSD) size = sizeof(page_stats_buf->pages_pagein); if (sysctlbyname("vm.stats.vm.v_swappgsin", &page_stats_buf->pages_pagein, &size, NULL, 0) < 0) { RETURN_WITH_SET_ERROR_WITH_ERRNO("page", SG_ERROR_SYSCTLBYNAME, "vm.stats.vm.v_swappgsin"); } size = sizeof(page_stats_buf->pages_pageout); if (sysctlbyname("vm.stats.vm.v_swappgsout", &page_stats_buf->pages_pageout, &size, NULL, 0) < 0) { RETURN_WITH_SET_ERROR_WITH_ERRNO("page", SG_ERROR_SYSCTLBYNAME, "vm.stats.vm.v_swappgsout"); } #elif defined(AIX) /* return code is number of structures returned */ if(perfstat_memory_total(NULL, &mem, sizeof(perfstat_memory_total_t), 1) != 1) { RETURN_WITH_SET_ERROR_WITH_ERRNO("page", SG_ERROR_SYSCTLBYNAME, "perfstat_memory_total"); } page_stats_buf->pages_pagein = mem.pgins; page_stats_buf->pages_pageout = mem.pgouts; #elif defined(HPUX) if( pstat_getvminfo( &vminfo, sizeof(vminfo), 1, 0 ) == -1 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("page", SG_ERROR_SYSCTLBYNAME, "pstat_getswap"); } page_stats_buf->pages_pagein = vminfo.psv_spgin; page_stats_buf->pages_pageout = vminfo.psv_spgout; #else RETURN_WITH_SET_ERROR("page", SG_ERROR_UNSUPPORTED, OS_TYPE); #endif return SG_ERROR_NONE; } static sg_error sg_get_page_stats_diff_int(sg_page_stats *tgt, const sg_page_stats *now, const sg_page_stats *last){ if( NULL == tgt ) { RETURN_WITH_SET_ERROR("page", SG_ERROR_INVALID_ARGUMENT, "sg_get_page_stats_diff_int(tgt)"); } if( now ) { *tgt = *now; if( last ) { tgt->pages_pagein -= last->pages_pagein; tgt->pages_pageout -= last->pages_pageout; tgt->systime -= last->systime; } } else { memset(tgt, 0, sizeof(*tgt)); } return SG_ERROR_NONE; } #if defined(HAVE_HOST_STATISTICS) || defined(HAVE_HOST_STATISTICS64) EXTENDED_COMP_SETUP(page,2,NULL); static sg_error sg_page_init_comp(unsigned id) { GLOBAL_SET_ID(page,id); self_host_port = mach_host_self(); return SG_ERROR_NONE; } EASY_COMP_DESTROY_FN(page) EASY_COMP_CLEANUP_FN(page,2) #else EASY_COMP_SETUP(page,2,NULL); #endif VECTOR_INIT_INFO_EMPTY_INIT(sg_page_stats); #define SG_PAGE_CUR_IDX 0 #define SG_PAGE_DIFF_IDX 1 EASY_COMP_ACCESS(sg_get_page_stats,page,page,SG_PAGE_CUR_IDX) EASY_COMP_DIFF(sg_get_page_stats_diff,sg_get_page_stats,page,page,SG_PAGE_DIFF_IDX,SG_PAGE_CUR_IDX) libstatgrab-0.90/src/libstatgrab/swap_stats.c000644 001750 001750 00000026704 12200025312 021331 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This 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. * * This 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 this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA * * $Id$ */ #define __NEED_SG_GET_SYS_PAGE_SIZE #include "tools.h" EXTENDED_COMP_SETUP(swap,1,NULL); #if defined(HAVE_STRUCT_XSWDEV) static int swapinfo_mib[2]; static bool swapinfo_array = false; static char *swapinfo_sysctl_name; #endif static sg_error sg_swap_init_comp(unsigned id) { ssize_t pagesize; #if defined(HAVE_STRUCT_XSWDEV) size_t len = lengthof(swapinfo_mib); #endif GLOBAL_SET_ID(swap,id); if((pagesize = sg_get_sys_page_size()) == -1) { RETURN_WITH_SET_ERROR_WITH_ERRNO("swap", SG_ERROR_SYSCONF, "_SC_PAGESIZE"); } #if defined(HAVE_STRUCT_XSWDEV) if( sysctlnametomib("vm.swap_info", swapinfo_mib, &len) < 0 ) { if( sysctlnametomib("vm.swap_info_array", swapinfo_mib, &len) < 0 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("mem", SG_ERROR_SYSCTLNAMETOMIB, "vm.swap_info + vm.swap_info_array"); } else { swapinfo_array = true; swapinfo_sysctl_name = "vm.swap_info_array"; } } else { swapinfo_array = false; swapinfo_sysctl_name = "vm.swap_info"; } #endif return SG_ERROR_NONE; } EASY_COMP_DESTROY_FN(swap) EASY_COMP_CLEANUP_FN(swap,1) static sg_error sg_get_swap_stats_int(sg_swap_stats *swap_stats_buf) { #ifdef HPUX #define SWAP_BATCH 5 struct pst_swapinfo pstat_swapinfo[SWAP_BATCH]; int swapidx = 0; int num, i; #elif defined(SOLARIS) # if defined(HAVE_STRUCT_SWAPTABLE) struct swaptable *swtbl; int nswap, i; # elif defined(HAVE_STRUCT_ANONINFO) struct anoninfo ai; # endif #elif defined(LINUX) || defined(CYGWIN) FILE *f; #define LINE_BUF_SIZE 256 char line_buf[LINE_BUF_SIZE]; unsigned long long value; unsigned matches = 0; #elif defined(HAVE_STRUCT_XSWDEV) struct xswdev xsw; struct xswdev *xswbuf = NULL, *xswptr = NULL; int n; int mib[16]; size_t mibsize, size; #elif defined(HAVE_STRUCT_XSW_USAGE) int mib[2] = {CTL_VM, VM_SWAPUSAGE}; struct xsw_usage xsw; size_t mibsize = 2, size = sizeof(xsw); #elif defined(HAVE_STRUCT_UVMEXP_SYSCTL) && defined(VM_UVMEXP2) int mib[2] = { CTL_VM, VM_UVMEXP2 }; struct uvmexp_sysctl uvm; size_t size = sizeof(uvm); #elif defined(HAVE_STRUCT_UVMEXP) && defined(VM_UVMEXP) int mib[2] = { CTL_VM, VM_UVMEXP }; struct uvmexp uvm; size_t size = sizeof(uvm); #elif defined(ALLBSD) /* fallback if no reasonable API is supported */ struct kvm_swap swapinfo; kvm_t *kvmd; #elif defined(AIX) perfstat_memory_total_t mem; #elif defined(WIN32) MEMORYSTATUSEX memstats; #endif swap_stats_buf->total = 0; swap_stats_buf->used = 0; swap_stats_buf->free = 0; #ifdef HPUX for(;;) { num = pstat_getswap(pstat_swapinfo, sizeof pstat_swapinfo[0], SWAP_BATCH, swapidx); if (num == -1) { RETURN_WITH_SET_ERROR_WITH_ERRNO("swap", SG_ERROR_PSTAT, "pstat_getswap"); } else if (num == 0) { break; } for (i = 0; i < num; ++i) { struct pst_swapinfo *si = &pstat_swapinfo[i]; if ((si->pss_flags & SW_ENABLED) != SW_ENABLED) continue; if ((si->pss_flags & SW_BLOCK) == SW_BLOCK) { swap_stats_buf->total += ((long long) si->pss_nblksavail) * 1024LL; swap_stats_buf->used += ((long long) si->pss_nfpgs) * 1024LL; swap_stats_buf->free = swap_stats_buf->total - swap_stats_buf->used; } if ((si->pss_flags & SW_FS) == SW_FS) { swap_stats_buf->total += ((long long) si->pss_limit) * 1024LL; swap_stats_buf->used += ((long long) si->pss_allocated) * 1024LL; swap_stats_buf->free = swap_stats_buf->total - swap_stats_buf->used; } } swapidx = pstat_swapinfo[num - 1].pss_idx + 1; } #elif defined(AIX) /* return code is number of structures returned */ if(perfstat_memory_total(NULL, &mem, sizeof(perfstat_memory_total_t), 1) != 1) { RETURN_WITH_SET_ERROR_WITH_ERRNO("swap", SG_ERROR_SYSCTLBYNAME, "perfstat_memory_total"); } swap_stats_buf->total = ((long long)mem.pgsp_total) * sys_page_size; swap_stats_buf->free = ((long long)mem.pgsp_free) * sys_page_size; swap_stats_buf->used = swap_stats_buf->total - swap_stats_buf->free; #elif defined(SOLARIS) # if defined(HAVE_STRUCT_SWAPTABLE) again: if( ( nswap = swapctl(SC_GETNSWP, 0) ) == -1 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("swap", SG_ERROR_SWAPCTL, NULL); } if( nswap != 0 ) { char *buf = sg_malloc( nswap * sizeof(char) * (PATH_MAX+1) + 1 ); if( NULL == buf ) { RETURN_FROM_PREVIOUS_ERROR( "swap", sg_get_error() ); } swtbl = sg_malloc( sizeof(*swtbl) + ( nswap * sizeof(swtbl->swt_ent[0]) ) ); if( NULL == swtbl ) { free(buf); RETURN_FROM_PREVIOUS_ERROR( "swap", sg_get_error() ); } memset( buf, 0, nswap * sizeof(char) * (PATH_MAX+1) + 1 ); memset( swtbl, 0, sizeof(*swtbl) + ( nswap * sizeof(swtbl->swt_ent[0]) ) ); for( i = 0; i < nswap; ++i ) swtbl->swt_ent[i].ste_path = buf + (i * (PATH_MAX+1)); swtbl->swt_n = nswap; if ((i = swapctl(SC_LIST, swtbl)) < 0) { free( buf ); free( swtbl ); RETURN_WITH_SET_ERROR_WITH_ERRNO("swap", SG_ERROR_SWAPCTL, NULL); } if( i > nswap ) { free( swtbl ); free( buf ); goto again; } for( i = 0; i < nswap; ++i ) { swap_stats_buf->total = swtbl->swt_ent[i].ste_pages; swap_stats_buf->free = swtbl->swt_ent[i].ste_free; } free( swtbl ); free( buf ); swap_stats_buf->total *= sys_page_size; swap_stats_buf->free *= sys_page_size; swap_stats_buf->used = swap_stats_buf->total - swap_stats_buf->free; } # elif defined(HAVE_STRUCT_ANONINFO) if (swapctl(SC_AINFO, &ai) == -1) { RETURN_WITH_SET_ERROR_WITH_ERRNO("swap", SG_ERROR_SWAPCTL, NULL); } swap_stats_buf->total = ai.ani_max; swap_stats_buf->total *= sys_page_size; swap_stats_buf->used = ai.ani_resv; swap_stats_buf->used *= sys_page_size; swap_stats_buf->free = swap_stats_buf->total - swap_stats_buf->used; # else RETURN_WITH_SET_ERROR("swap", SG_ERROR_UNSUPPORTED, OS_TYPE); # endif #elif defined(LINUX) || defined(CYGWIN) if ((f = fopen("/proc/meminfo", "r")) == NULL) { RETURN_WITH_SET_ERROR_WITH_ERRNO("swap", SG_ERROR_OPEN, "/proc/meminfo"); } while( (matches < 2) && (fgets(line_buf, sizeof(line_buf), f) != NULL) ) { if (sscanf(line_buf, "%*s %llu kB", &value) != 1) continue; value *= 1024; if (strncmp(line_buf, "SwapTotal:", 10) == 0) { swap_stats_buf->total = value; ++matches; } else if (strncmp(line_buf, "SwapFree:", 9) == 0) { swap_stats_buf->free = value; ++matches; } } fclose(f); if( matches < 2 ) { RETURN_WITH_SET_ERROR( "swap", SG_ERROR_PARSE, "/proc/meminfo" ); } swap_stats_buf->used = swap_stats_buf->total - swap_stats_buf->free; #elif defined(HAVE_STRUCT_XSWDEV) mibsize = 2; if( swapinfo_array ) { size = 0; if( sysctl( swapinfo_mib, 2, NULL, &size, NULL, 0 ) < 0 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("swap", SG_ERROR_SYSCTL, swapinfo_sysctl_name); } if( NULL == ( xswbuf = sg_malloc( size ) ) ) { RETURN_FROM_PREVIOUS_ERROR( "swap", sg_get_error() ); } if( sysctl( swapinfo_mib, 2, xswbuf, &size, NULL, 0 ) < 0 ) { RETURN_WITH_SET_ERROR_WITH_ERRNO("swap", SG_ERROR_SYSCTL, swapinfo_sysctl_name); } } else { mib[0] = swapinfo_mib[0]; mib[1] = swapinfo_mib[1]; } for (n = 0; ; ++n) { if( !swapinfo_array ) { mib[mibsize] = n; size = sizeof(xsw); if (sysctl(mib, (unsigned)(mibsize + 1), &xsw, &size, NULL, 0) < 0) { if (errno == ENOENT) break; free( xswbuf ); RETURN_WITH_SET_ERROR_WITH_ERRNO("swap", SG_ERROR_SYSCTL, swapinfo_sysctl_name); } xswptr = &xsw; } # if defined(HAVE_STRUCT_XSWDEV_SIZE) else { if( ((size_t)n) >= (size / xswbuf->xsw_size) ) break; xswptr = xswbuf + n; } if( xswptr == NULL ) { RETURN_WITH_SET_ERROR("swap", SG_ERROR_MEMSTATUS, "no swap status"); } # ifdef XSWDEV_VERSION if( xswptr->xsw_version != XSWDEV_VERSION ) { free( xswbuf ); RETURN_WITH_SET_ERROR("swap", SG_ERROR_XSW_VER_MISMATCH, NULL); } # endif # endif swap_stats_buf->total += (unsigned long long) xswptr->xsw_nblks; swap_stats_buf->used += (unsigned long long) xswptr->xsw_used; } free( xswbuf ); swap_stats_buf->total *= (size_t)sys_page_size; swap_stats_buf->used *= (size_t)sys_page_size; if( 0 == swap_stats_buf->free ) swap_stats_buf->free = swap_stats_buf->total - swap_stats_buf->used; else swap_stats_buf->free *= (size_t)sys_page_size; #elif defined(HAVE_STRUCT_XSW_USAGE) if (sysctl(mib, (unsigned)mibsize, &xsw, &size, NULL, 0) < 0) { RETURN_WITH_SET_ERROR_WITH_ERRNO("swap", SG_ERROR_SYSCTL, "CTL_VM.VM_SWAPUSAGE" ); } swap_stats_buf->total = (unsigned long long) xsw.xsu_total; swap_stats_buf->used = (unsigned long long) xsw.xsu_used; swap_stats_buf->free = (unsigned long long) xsw.xsu_avail; #elif defined(HAVE_STRUCT_UVMEXP_SYSCTL) && defined(VM_UVMEXP2) if (sysctl(mib, 2, &uvm, &size, NULL, 0) < 0) { RETURN_WITH_SET_ERROR_WITH_ERRNO("swap", SG_ERROR_SYSCTL, "CTL_VM.VM_UVMEXP2"); } swap_stats_buf->total = uvm.pagesize * uvm.swpages; swap_stats_buf->used = uvm.pagesize * uvm.swpginuse; /* XXX swpgonly ? */ swap_stats_buf->free = swap_stats_buf->total - swap_stats_buf->used; #elif defined(HAVE_STRUCT_UVMEXP) && defined(VM_UVMEXP) if (sysctl(mib, 2, &uvm, &size, NULL, 0) < 0) { RETURN_WITH_SET_ERROR_WITH_ERRNO("swap", SG_ERROR_SYSCTL, "CTL_VM.VM_UVMEXP"); } swap_stats_buf->total = (unsigned long long)uvm.pagesize * (unsigned long long)uvm.swpages; swap_stats_buf->used = (unsigned long long)uvm.pagesize * (unsigned long long)uvm.swpginuse; /* XXX swpgonly ? */ swap_stats_buf->free = swap_stats_buf->total - swap_stats_buf->used; #elif defined(ALLBSD) /* XXX probably not mt-safe! */ kvmd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, NULL); if(kvmd == NULL) { RETURN_WITH_SET_ERROR("swap", SG_ERROR_KVM_OPENFILES, NULL); } if ((kvm_getswapinfo(kvmd, &swapinfo, 1,0)) == -1) { kvm_close( kvmd ); RETURN_WITH_SET_ERROR("swap", SG_ERROR_KVM_GETSWAPINFO, NULL); } swap_stats_buf->total = (long long)swapinfo.ksw_total; swap_stats_buf->used = (long long)swapinfo.ksw_used; kvm_close( kvmd ); swap_stats_buf->total *= sys_page_size; swap_stats_buf->used *= sys_page_size; swap_stats_buf->free = swap_stats_buf->total - swap_stats_buf->used; #elif defined(WIN32) memstats.dwLength = sizeof(memstats); if (!GlobalMemoryStatusEx(&memstats)) { RETURN_WITH_SET_ERROR_WITH_ERRNO("swap", SG_ERROR_MEMSTATUS, "GloblaMemoryStatusEx"); } /* the PageFile stats include Phys memory "minus an overhead". * Due to this unknown "overhead" there's no way to extract just page * file use from these numbers */ swap_stats_buf->total = memstats.ullTotalPageFile; swap_stats_buf->free = memstats.ullAvailPageFile; swap_stats_buf->used = swap_stats_buf->total - swap_stats_buf->free; #else RETURN_WITH_SET_ERROR("swap", SG_ERROR_UNSUPPORTED, OS_TYPE); #endif swap_stats_buf->systime = time(NULL); return SG_ERROR_NONE; } VECTOR_INIT_INFO_EMPTY_INIT(sg_swap_stats); #define SG_SWAP_CUR_IDX 0 EASY_COMP_ACCESS(sg_get_swap_stats,swap,swap,SG_SWAP_CUR_IDX) libstatgrab-0.90/src/saidar/saidar.c000644 001750 001750 00000050051 12200025312 017341 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id$ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_TERMIOS_H #include #elif defined(HAVE_SYS_TERMIOS_H) #include #endif #ifdef HAVE_NCURSES_H #define COLOR_SUPPORT #endif #if defined(HAVE_NCURSES_H) # include #elif defined(HAVE_NCURSES_NCURSES_H) # include #elif defined(HAVE_CURSES_H) # include #endif #define THRESHOLD_LOAD 1.0 #define THRESHOLD_WARN_ZMB 0 #define THRESHOLD_WARN_CPU 60.0 #define THRESHOLD_ALERT_CPU 90.0 #define THRESHOLD_WARN_SWAP 75.0 #define THRESHOLD_ALERT_SWAP 90.0 #define THRESHOLD_WARN_MEM 75.0 #define THRESHOLD_ALERT_MEM 90.0 #define THRESHOLD_WARN_DISK 75.0 #define THRESHOLD_ALERT_DISK 90.0 #ifndef lengthof #define lengthof(x) (sizeof(x)/sizeof((x)[0])) #endif static int sig_winch_flag = 0; typedef struct{ sg_cpu_percents *cpu_percents; sg_mem_stats *mem_stats; sg_swap_stats *swap_stats; sg_load_stats *load_stats; sg_process_count *process_count; sg_page_stats *page_stats; sg_network_io_stats *network_io_stats; size_t network_io_entries; sg_disk_io_stats *disk_io_stats; size_t disk_io_entries; sg_fs_stats *fs_stats; size_t fs_entries; sg_host_info *host_info; sg_user_stats *user_stats; size_t user_entries; } stats_t; static stats_t stats; #if 0 static char * isize_conv(long long number){ char type[] = {'B', 'K', 'M', 'G', 'T', 'P'}; size_t x=0; int sign=1; static char string[10]; if(number < 0){ sign=-1; number=-number; } for(;xhostname, (sizeof(hostname) - 1)); /* strncpy does not NULL terminate.. If only strlcpy was on all platforms :) */ hostname[14] = '\0'; ptr=strchr(hostname, '.'); /* Some hosts give back a FQDN for hostname. To avoid this, we'll * just blank out everything after the first "." */ if (ptr != NULL){ *ptr = '\0'; } if (colors) { attron(COLOR_PAIR(1)); } printw("%s", hostname); move(0,36); printw("%s", hr_uptime(stats.host_info->uptime)); epoc_time=time(NULL); tm_time = localtime(&epoc_time); strftime(cur_time, 20, "%Y-%m-%d %T", tm_time); move(0,61); printw("%s", cur_time); if (colors) { attroff(COLOR_PAIR(1)); } } if (stats.load_stats != NULL) { /* Load */ if (colors) { attron(COLOR_PAIR(6)); } move(2,12); if (colors && fabs(stats.load_stats->min1 - stats.load_stats->min5) > THRESHOLD_LOAD) { attron(A_BOLD); } printw("%6.2f", stats.load_stats->min1); if (colors) { attroff(A_BOLD); } move(3,12); if (colors && fabs(stats.load_stats->min5 - stats.load_stats->min15) > THRESHOLD_LOAD) { attron(A_BOLD); } printw("%6.2f", stats.load_stats->min5); if (colors) { attroff(A_BOLD); } move(4,12); if (colors && fabs(stats.load_stats->min1 - stats.load_stats->min15) > THRESHOLD_LOAD) { attron(A_BOLD); } printw("%6.2f", stats.load_stats->min15); if (colors) { attroff(A_BOLD); } } if (stats.cpu_percents != NULL) { /* CPU */ move(2,33); printw("%6.2f%%", stats.cpu_percents->idle); move(3,33); printw("%6.2f%%", (stats.cpu_percents->kernel + stats.cpu_percents->iowait + stats.cpu_percents->swap)); move(4,33); if (colors && stats.cpu_percents->user + stats.cpu_percents->nice > THRESHOLD_ALERT_CPU) { attron(A_STANDOUT); attron(A_BOLD); } else if (colors && stats.cpu_percents->user + stats.cpu_percents->nice > THRESHOLD_WARN_CPU) { attron(A_BOLD); } printw("%6.2f%%", (stats.cpu_percents->user + stats.cpu_percents->nice)); if(colors) { attroff(A_BOLD); attroff(A_STANDOUT); attron(COLOR_PAIR(6)); } } if (stats.process_count != NULL) { /* Process */ move(2, 54); printw("%5llu", stats.process_count->running); move(2,74); if (colors && stats.process_count->zombie > THRESHOLD_WARN_ZMB) { attron(A_STANDOUT); attron(A_BOLD); } printw("%5llu", stats.process_count->zombie); if(colors) { attroff(A_STANDOUT); attroff(A_BOLD); } move(3, 54); printw("%5llu", stats.process_count->sleeping); move(3, 74); printw("%5llu", stats.process_count->total); move(4, 54); printw("%5llu", stats.process_count->stopped); } if (stats.user_stats != NULL) { move(4,74); printw("%5lu", stats.user_entries); } if(colors) { attroff(COLOR_PAIR(6)); attron(COLOR_PAIR(5)); } if (stats.mem_stats != NULL) { /* Mem */ move(6, 12); printw("%7s", size_conv(stats.mem_stats->total)); move(7, 12); printw("%7s", size_conv(stats.mem_stats->used)); move(8, 12); printw("%7s", size_conv(stats.mem_stats->free)); } if (stats.swap_stats != NULL) { /* Swap */ move(6, 32); printw("%8s", size_conv(stats.swap_stats->total)); move(7, 32); printw("%8s", size_conv(stats.swap_stats->used)); move(8, 32); printw("%8s", size_conv(stats.swap_stats->free)); } /* VM */ if (stats.mem_stats != NULL && stats.mem_stats->total != 0) { float f = 100.00 * (float)(stats.mem_stats->used)/stats.mem_stats->total; if (colors && f > THRESHOLD_ALERT_MEM) { attron(A_STANDOUT); attron(A_BOLD); } else if (colors && f > THRESHOLD_WARN_MEM) { attron(A_BOLD); } move(6, 54); printw("%5.2f%%", f); if (colors) { attroff(A_STANDOUT); attroff(A_BOLD); attron(COLOR_PAIR(5)); } } if (stats.swap_stats != NULL && stats.swap_stats->total != 0) { float f = 100.00 * (float)(stats.swap_stats->used)/stats.swap_stats->total; if (colors && f > THRESHOLD_ALERT_SWAP) { attron(A_STANDOUT); attron(A_BOLD); } else if (colors && f > THRESHOLD_WARN_SWAP) { attron(A_BOLD); } move(7, 54); printw("%5.2f%%", f); if (colors) { attroff(A_STANDOUT); attroff(A_BOLD); attron(COLOR_PAIR(5)); } } if (stats.mem_stats != NULL && stats.swap_stats != NULL && stats.mem_stats->total != 0 && stats.swap_stats->total != 0) { move(8, 54); printw("%5.2f%%", (100.00 * (float)(stats.mem_stats->used+stats.swap_stats->used)/(stats.mem_stats->total+stats.swap_stats->total))); } if (stats.page_stats != NULL) { /* Paging */ move(6, 74); printw("%5llu", (stats.page_stats->systime)? (stats.page_stats->pages_pagein / stats.page_stats->systime): stats.page_stats->pages_pagein); move(7, 74); printw("%5llu", (stats.page_stats->systime)? (stats.page_stats->pages_pageout / stats.page_stats->systime) : stats.page_stats->pages_pageout); } if (colors) { attroff(COLOR_PAIR(5)); } line = 11; if (stats.disk_io_stats != NULL) { /* Disk IO */ disk_io_stat_ptr = stats.disk_io_stats; r=0; w=0; for(counter=0;counterdisk_name, sizeof(name)); name[sizeof(name)-1] = '\0'; /* strncpy doesn't terminate longer strings */ move(line, 0); printw("%s", name); move(line, 12); rt = (disk_io_stat_ptr->systime)? (disk_io_stat_ptr->read_bytes/disk_io_stat_ptr->systime): disk_io_stat_ptr->read_bytes; if(colors) { attron(COLOR_PAIR(4)); } printw("%7s", size_conv(rt)); r+=rt; move(line, 26); wt = (disk_io_stat_ptr->systime)? (disk_io_stat_ptr->write_bytes/disk_io_stat_ptr->systime): disk_io_stat_ptr->write_bytes; printw("%7s", size_conv(wt)); w+=wt; disk_io_stat_ptr++; line++; if(colors) { attroff(COLOR_PAIR(4)); } } line++; move(line, 0); printw("Total"); move(line, 12); if(colors) { attron(COLOR_PAIR(4)); } printw("%7s", size_conv(r)); move(line, 26); printw("%7s", size_conv(w)); if(colors) { attroff(COLOR_PAIR(4)); } } line = 11; if (stats.network_io_stats != NULL) { /* Network */ network_stat_ptr = stats.network_io_stats; for(counter=0;counterinterface_name, sizeof(name)); name[sizeof(name)-1] = '\0'; /* strncpy doesn't terminate longer strings */ move(line, 42); printw("%s", name); move(line, 62); rt = (network_stat_ptr->systime)? (network_stat_ptr->rx / network_stat_ptr->systime): network_stat_ptr->rx; if(colors) { attron(COLOR_PAIR(4)); } printw("%7s", size_conv(rt)); move(line, 72); wt = (network_stat_ptr->systime)? (network_stat_ptr->tx / network_stat_ptr->systime): network_stat_ptr->tx; printw("%7s", size_conv(wt)); network_stat_ptr++; line++; if(colors) { attroff(COLOR_PAIR(4)); } } line += 2; } if (stats.fs_stats != NULL) { /* Disk */ disk_stat_ptr = stats.fs_stats; for(counter=0;countermnt_point, sizeof(name)); name[sizeof(name)-1] = '\0'; /* strncpy doesn't terminate longer strings */ move(line, 42); printw("%s", name); move(line, 62); if(colors) { attron(COLOR_PAIR(2)); } printw("%7s", size_conv(disk_stat_ptr->avail)); move(line, 73); if(colors && 100.00 * ((float) disk_stat_ptr->used / (float) (disk_stat_ptr->used + disk_stat_ptr->avail)) > THRESHOLD_ALERT_DISK) { attron(A_STANDOUT); attron(A_BOLD); } else if (colors && 100.00 * ((float) disk_stat_ptr->used / (float) (disk_stat_ptr->used + disk_stat_ptr->avail)) > THRESHOLD_WARN_DISK) { attron(A_BOLD); } printw("%6.2f%%", 100.00 * ((float) disk_stat_ptr->used / (float) (disk_stat_ptr->used + disk_stat_ptr->avail))); disk_stat_ptr++; line++; if(colors) { attroff(COLOR_PAIR(2)); attroff(A_STANDOUT); attroff(A_BOLD); } } } refresh(); } static void sig_winch_handler(int dummy) { (void)dummy; sig_winch_flag = 1; signal(SIGWINCH, sig_winch_handler); } static int get_stats(void) { stats.cpu_percents = sg_get_cpu_percents(NULL); stats.mem_stats = sg_get_mem_stats(NULL); stats.swap_stats = sg_get_swap_stats(NULL); stats.load_stats = sg_get_load_stats(NULL); stats.process_count = sg_get_process_count(); stats.page_stats = sg_get_page_stats_diff(NULL); stats.network_io_stats = sg_get_network_io_stats_diff(&(stats.network_io_entries)); stats.disk_io_stats = sg_get_disk_io_stats_diff(&(stats.disk_io_entries)); stats.fs_stats = sg_get_fs_stats(&(stats.fs_entries)); stats.host_info = sg_get_host_info(NULL); stats.user_stats = sg_get_user_stats(&stats.user_entries); return 1; } static void version_num(char const *progname) { fprintf(stderr, "%s version %s\n", progname, PACKAGE_VERSION); fprintf(stderr, "\nReport bugs to <%s>.\n", PACKAGE_BUGREPORT); exit(1); } static void die(const char *s) { fprintf(stderr, "fatal: %s\n", s); exit(1); } static void sg_die(const char *prefix, int exit_code) { sg_error_details err_det; char *errmsg = NULL; sg_error errc; if( SG_ERROR_NONE != ( errc = sg_get_error_details(&err_det) ) ) { fprintf(stderr, "panic: can't get error details (%d, %s)\n", errc, sg_str_error(errc)); exit(exit_code); } if( NULL == sg_strperror(&errmsg, &err_det) ) { errc = sg_get_error(); fprintf(stderr, "panic: can't prepare error message (%d, %s)\n", errc, sg_str_error(errc)); exit(exit_code); } fprintf( stderr, "%s: %s\n", prefix, errmsg ); free( errmsg ); exit(exit_code); } void usage(char *progname){ #ifdef COLOR_SUPPORT fprintf(stderr, "Usage: %s [-d delay] [-c] [-v] [-h]\n\n", progname); #else fprintf(stderr, "Usage: %s [-d delay] [-v] [-h]\n\n", progname); #endif fprintf(stderr, " -d Sets the update time in seconds\n"); #ifdef COLOR_SUPPORT fprintf(stderr, " -c Enables coloured output\n"); #endif fprintf(stderr, " -v Prints version number\n"); fprintf(stderr, " -h Displays this help information.\n"); fprintf(stderr, "\nReport bugs to <%s>.\n", PACKAGE_BUGREPORT); exit(1); } #ifndef HAVE_STRNDUP static char * strndup(char const *s, size_t n) { char *r = malloc(n + 1); char *d = r; if(!r) return r; while((n-- != 0) && *s) *d++ = *s++; *d = 0; return r; } #endif #define STACK_UNIT 4 static char const ** push_item(char const **stack, char const *item, size_t items) { char const **s = stack; size_t stack_size = items; size_t desired = (items / STACK_UNIT) * STACK_UNIT; if (desired < ++items) { desired = ((items / STACK_UNIT) + 1) * STACK_UNIT; if (desired >= stack_size) { s = realloc(stack, desired * sizeof(stack[0])); if(NULL == s) die("Out of memory"); } } s[stack_size] = item; return s; } static int sg_is_spc(char ch) { unsigned char uch = (unsigned char)ch; int i = (int)((unsigned)uch); return isspace(i); } static char const ** split_list(char const *list) { char const *l = list; char const **sp = NULL; size_t items = 0; for(l = list; *l; ) { while(*l && !(sg_is_spc(*l) || (',' == *l))) ++l; sp = push_item(sp, strndup(list, l-list), items++); while(*l && (sg_is_spc(*l) || (',' == *l))) ++l; list = l; } sp = push_item(sp, NULL, items); return sp; } static int fsnmcmp(const void *va, const void *vb) { const char *a = * (char * const *)va; const char *b = * (char * const *)vb; if( a && b ) return strcasecmp(a, b); /* force NULL sorted at end */ if( a && !b ) return -1; if( !a && b ) return 1; return 0; } static sg_error set_valid_filesystems(char const *fslist) { char const **newfs; char const **given_fs; while(sg_is_spc(*fslist)) ++fslist; if('!' == *fslist) { size_t new_items = 0, given_items = 0; const char **old_valid_fs = sg_get_valid_filesystems(0); if( NULL == old_valid_fs ) sg_die("sg_get_valid_filesystems()", 1); ++fslist; while(*fslist && sg_is_spc(*fslist)) ++fslist; given_fs = split_list(fslist); for(newfs = given_fs; *newfs; ++newfs) { ++given_items; } qsort(given_fs, given_items, sizeof(given_fs[0]), fsnmcmp); newfs = NULL; new_items = 0; while(*old_valid_fs) { if (NULL == bsearch(old_valid_fs, given_fs, given_items, sizeof(given_fs[0]), fsnmcmp)) { newfs = push_item(newfs, *old_valid_fs, new_items++); } ++old_valid_fs; } newfs = push_item(newfs, NULL, new_items); } else { newfs = given_fs = split_list(fslist); } if( SG_ERROR_NONE != sg_set_valid_filesystems( newfs ) ) sg_die("sg_set_valid_filesystems() failed", 1); for(newfs = given_fs; *newfs; ++newfs) { free((void *)(*newfs)); } return SG_ERROR_NONE; } int main(int argc, char **argv){ int c; int colouron = 0; char *fslist = NULL; time_t last_update = 0; extern int errno; int delay=2; sg_log_init("saidar", "SAIDAR_LOG_PROPERTIES", argc ? argv[0] : NULL); sg_init(1); if(sg_drop_privileges() != 0){ fprintf(stderr, "Failed to drop setuid/setgid privileges\n"); return 1; } #ifdef COLOR_SUPPORT while ((c = getopt(argc, argv, "d:F:cvh")) != -1){ #else while ((c = getopt(argc, argv, "d:F:vh")) != -1){ #endif switch (c){ case 'd': delay = atoi(optarg); if (delay < 1){ fprintf(stderr, "Time must be 1 second or greater\n"); exit(1); } break; #ifdef COLOR_SUPPORT case 'c': colouron = 1; break; #endif case 'v': version_num(argv[0]); break; case 'h': default: usage(argv[0]); return 1; } } if (fslist) { sg_error rc = set_valid_filesystems(fslist); if(rc != SG_ERROR_NONE) die(sg_str_error(rc)); free(fslist); } else { sg_error rc = set_valid_filesystems("!nfs, nfs3, nfs4, cifs, smbfs, samba, autofs"); if(rc != SG_ERROR_NONE) die(sg_str_error(rc)); } signal(SIGWINCH, sig_winch_handler); initscr(); #ifdef COLOR_SUPPORT /* turn on colour */ if (colouron) { if (has_colors()) { start_color(); use_default_colors(); init_pair(1,COLOR_RED,-1); init_pair(2,COLOR_GREEN,-1); init_pair(3,COLOR_YELLOW,-1); init_pair(4,COLOR_BLUE,-1); init_pair(5,COLOR_MAGENTA,-1); init_pair(6,COLOR_CYAN,-1); } else { fprintf(stderr, "Colour support disabled: your terminal does not support colour."); colouron = 0; } } #endif nonl(); curs_set(0); cbreak(); noecho(); timeout(delay * 1000); newwin(0, 0, 0, 0); clear(); if(!get_stats()){ fprintf(stderr, "Failed to get all the stats. Please check correct permissions\n"); endwin(); return 1; } display_headings(); for(;;){ time_t now; int ch = getch(); if (ch == 'q'){ break; } /* To keep the numbers slightly accurate we do not want them * updating more frequently than once a second. */ now = time(NULL); if ((now - last_update) >= 1) { get_stats(); } last_update = now; if(sig_winch_flag) { clear(); display_headings(); sig_winch_flag = 0; } display_data(colouron); } endwin(); sg_shutdown(); return 0; } libstatgrab-0.90/src/saidar/Makefile.am000644 001750 001750 00000001452 12200025312 017767 0ustar00tdbusers000000 000000 # Makefile for libstatgrab/src/saidar # http://www.i-scream.org/libstatgrab/ # $Id$ if SAIDAR bin_PROGRAMS = saidar endif saidar_SOURCES = saidar.c AM_CPPFLAGS = @SAIDARCPPFLAGS@ -I$(top_srcdir) -I$(top_builddir) \ -I$(top_srcdir)/src -I$(top_builddir)/src \ -I$(top_srcdir)/src/libstatgrab -I$(top_builddir)/src/libstatgrab \ @CLIBFLAGS@ LDADD = $(top_builddir)/src/libstatgrab/libstatgrab.la @SAIDARLIBS@ @LINKFLAGS@ install-exec-local: if SAIDAR if SETGIDBINS # Some operating systems need the binary to be setgid kmem chgrp kmem $(DESTDIR)@bindir@/saidar chmod g+s $(DESTDIR)@bindir@/saidar endif if SETUIDBINS # Some operating systems need the binary to be setuid root chown root $(DESTDIR)@bindir@/saidar chmod u+s $(DESTDIR)@bindir@/saidar endif endif libstatgrab-0.90/src/saidar/Makefile.in000644 001750 001750 00000045473 12200045540 020020 0ustar00tdbusers000000 000000 # Makefile.in generated by automake 1.12.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile for libstatgrab/src/saidar # http://www.i-scream.org/libstatgrab/ # $Id$ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @SAIDAR_TRUE@bin_PROGRAMS = saidar$(EXEEXT) subdir = src/saidar DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_lib.m4 \ $(top_srcdir)/m4/ax_ncurses.m4 $(top_srcdir)/m4/ax_perl5.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_shellvars.m4 $(top_srcdir)/m4/ax_types.m4 \ $(top_srcdir)/m4/ax_visibility.m4 $(top_srcdir)/m4/ax_win32.m4 \ $(top_srcdir)/m4/ax_xopen.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_saidar_OBJECTS = saidar.$(OBJEXT) saidar_OBJECTS = $(am_saidar_OBJECTS) saidar_LDADD = $(LDADD) saidar_DEPENDENCIES = $(top_builddir)/src/libstatgrab/libstatgrab.la DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(saidar_SOURCES) DIST_SOURCES = $(saidar_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIN_GROUP = @BIN_GROUP@ BIN_OWNER = @BIN_OWNER@ BIN_PERM = @BIN_PERM@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CLIBFLAGS = @CLIBFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOCBOOK2MAN = @DOCBOOK2MAN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ HAVE_LIBLOG4CPLUS = @HAVE_LIBLOG4CPLUS@ INC_LOG4CPLUS = @INC_LOG4CPLUS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBS_LOG4CPLUS = @LIBS_LOG4CPLUS@ LIBTOOL = @LIBTOOL@ LINKFLAGS = @LINKFLAGS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL5 = @PERL5@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SAIDARCPPFLAGS = @SAIDARCPPFLAGS@ SAIDARLIBS = @SAIDARLIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SG_EXPORT = @SG_EXPORT@ SG_IMPORT = @SG_IMPORT@ SG_PRIVATE = @SG_PRIVATE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_LIBLOG4CPLUS = @WITH_LIBLOG4CPLUS@ WITH_THREADS_CONFIGURED = @WITH_THREADS_CONFIGURED@ WITH_VISIBILITY_SUPPORT = @WITH_VISIBILITY_SUPPORT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log4cplus_CFLAGS = @log4cplus_CFLAGS@ log4cplus_LIBS = @log4cplus_LIBS@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ saidar_SOURCES = saidar.c AM_CPPFLAGS = @SAIDARCPPFLAGS@ -I$(top_srcdir) -I$(top_builddir) \ -I$(top_srcdir)/src -I$(top_builddir)/src \ -I$(top_srcdir)/src/libstatgrab -I$(top_builddir)/src/libstatgrab \ @CLIBFLAGS@ LDADD = $(top_builddir)/src/libstatgrab/libstatgrab.la @SAIDARLIBS@ @LINKFLAGS@ all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/saidar/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/saidar/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p || test -f $$p1; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list saidar$(EXEEXT): $(saidar_OBJECTS) $(saidar_DEPENDENCIES) $(EXTRA_saidar_DEPENDENCIES) @rm -f saidar$(EXEEXT) $(LINK) $(saidar_OBJECTS) $(saidar_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/saidar.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-exec-local install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool cscopelist ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-binPROGRAMS install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-exec-local install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am \ uninstall-binPROGRAMS install-exec-local: # Some operating systems need the binary to be setgid kmem @SAIDAR_TRUE@@SETGIDBINS_TRUE@ chgrp kmem $(DESTDIR)@bindir@/saidar @SAIDAR_TRUE@@SETGIDBINS_TRUE@ chmod g+s $(DESTDIR)@bindir@/saidar # Some operating systems need the binary to be setuid root @SAIDAR_TRUE@@SETUIDBINS_TRUE@ chown root $(DESTDIR)@bindir@/saidar @SAIDAR_TRUE@@SETUIDBINS_TRUE@ chmod u+s $(DESTDIR)@bindir@/saidar # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libstatgrab-0.90/m4/ltoptions.m4000444 001750 001750 00000030073 12200045532 016523 0ustar00tdbusers000000 000000 # Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) libstatgrab-0.90/m4/ax_visibility.m4000644 001750 001750 00000005045 12200025312 017344 0ustar00tdbusers000000 000000 dnl find flags to hide symbols from being exported in a shared library dnl dnl Motivation: prevent developers to use internal API dnl dnl Jens Rehsack dnl AX_CHECK_VISIBILITY([action-if-found], [action-if-not-found]) dnl AC_DEFUN([AX_CHECK_VISIBILITY], [ AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_LD])dnl AC_CACHE_CHECK([how to control symbol visibility], [ax_cv_visibility], [ ac_save_[]_AC_LANG_ABBREV[]_werror_flag="$ac_[]_AC_LANG_ABBREV[]_werror_flag" AC_LANG_WERROR() AC_COMPILE_IFELSE( [AC_LANG_SOURCE([ int __attribute__ ((visibility("default"))) foo() { return 1; } int __attribute__ ((visibility("hidden"))) bar() { return 1; } int __attribute__ ((visibility("private"))) baz() { return 1; } ])], [ dnl GNU C 4 style is supported ax_cv_visibility="gcc4" ], [ AC_COMPILE_IFELSE( [AC_LANG_SOURCE([ int __attribute__ ((dllexport)) foo() { return 1; } ])], [ dnl GNU C 3 style ax_cv_visibility="gcc3" ], [ AC_COMPILE_IFELSE( [AC_LANG_SOURCE([ int __hidden foo() { return 1; } ])], [ dnl SUN Pro style ax_cv_visibility="sunpro" ], [ AC_COMPILE_IFELSE( [AC_LANG_SOURCE([ int __declspec(dllexport) foo() { return 1; } ])], [ dnl Microsoft style ax_cv_visibility="ms" ], [ dnl probably add support for e.g. .def files (AIX, Windows) ax_cv_visibility="unknown" ]) ]) ]) ]) ac_[]_AC_LANG_ABBREV[]_werror_flag="$ac_save_[]_AC_LANG_ABBREV[]_werror_flag" ]) AS_CASE([$ax_cv_visibility], [gcc4], [ ax_visibility_export='__attribute__((visibility("default")))' ax_visibility_import='__attribute__((visibility("default")))' ax_visibility_private='__attribute__((visibility("hidden")))' ], [gcc3], [ ax_visibility_export='__attribute__((dllexport))' ax_visibility_import='__attribute__((dllimport))' ax_visibility_private='' ], [sunpro], [ ax_visibility_export='__global' ax_visibility_import='__global' ax_visibility_private='__hidden' ], [ms], [ ax_visibility_export='__declspec(dllexport)' ax_visibility_import='__declspec(dllimport)' ax_visibility_private='' ], [ ax_visibility_export='' ax_visibility_import='' ax_visibility_private='' ] ) AS_IF([test "x$ax_cv_visibility" != "xunknown"],[m4_ifnblank([$1],[$1],[:])],[m4_ifnblank([$2],[$2],[:])]) ]) libstatgrab-0.90/m4/ltsugar.m4000444 001750 001750 00000010424 12200045532 016147 0ustar00tdbusers000000 000000 # ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) libstatgrab-0.90/m4/ax_win32.m4000644 001750 001750 00000001350 12200025312 016112 0ustar00tdbusers000000 000000 dnl @synopsis AX_WIN32([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) dnl dnl @summary figure out whether the target is native WIN32 or not AC_DEFUN([AX_WIN32], [ AC_LANG_SAVE AC_LANG_C AC_CACHE_CHECK( [whether compiling for native Win32], ax_cv_native_win32, [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[]], [[ #ifndef _WIN32 #error "Not Win32" #endif ]] )], [ax_cv_native_win32=yes], [ax_cv_native_win32=no] ) ]) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: AS_IF([test x"$ax_cv_native_win32" = xyes],[$1],[$2]) AC_LANG_RESTORE ])dnl AX_WIN32 libstatgrab-0.90/m4/ax_lib.m4000644 001750 001750 00000026003 12200025312 015720 0ustar00tdbusers000000 000000 dnl Find a library and update compiler flags dnl dnl Motivation: lib-link.m4/AC_LIB_HAVE_LINKFLAGS doesn't work with dnl prefixed path's on AIX/HPUX dnl dnl Jens Rehsack dnl AX_CHECK_WITH_LIB(name,[default]) dnl Declares configure options dnl --with-${name} dnl --without-${name} dnl --with-lib${name}-prefix dnl --without-lib${name}-prefix dnl If neither --with-${name} nor --without-${name} is specified for configure dnl run, the default (default: check) is taken AC_DEFUN([AX_CHECK_WITH_LIB], [ dnl AC_REQUIRE(AC_PROG_SED)dnl define([Name],[patsubst(translit([$1],[./+-], [____]),[_*$])]) define([NAME],[patsubst(translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____]),[_*$])]) AC_CACHE_CHECK([if lib[]$1 is wanted], [ax_cv_with_lib[]Name], [ ifelse([], [$2], [ax_with_lib[]Name[]_default="check"], [ax_with_lib[]Name[]_default="$2"]) AC_ARG_WITH(Name, [ --with-[]Name[] will check for $1 --without-[]Name[] will not check for $1], [ax_with_lib[]Name="${withval}"], [ax_with_lib[]Name="${ax_with_lib[]Name[]_default}"] ) ax_cv_with_lib[]Name="${ax_with_lib[]Name}"]) AC_CACHE_CHECK([if lib[]$1 wants a prefix], [ax_cv_with_lib[]Name[]_prefix], [ AS_IF( [test "x${ax_with_lib[]Name[]}" != "xno"], [ AC_ARG_WITH([lib[]Name[]-prefix], [ --with-lib[]Name[]-prefix[[=DIR]] search for $1 in DIR/include and DIR/lib --without-lib[]Name[]-prefix search for $1 in DIR/include and DIR/lib], [ ax_with_lib[]Name[]_prefix="`echo ${withval} | ${SED} -e 's|/*$||'`" ], [ax_with_lib[]Name[]_prefix=""] ) ], [ax_with_lib[]Name[]_prefix=""] ) AS_IF([test "x${ax_with_lib[]Name[]_prefix}" != "x"], [ax_cv_with_lib[]Name[]_prefix="${ax_with_lib[]Name[]_prefix}"], [ax_cv_with_lib[]Name[]_prefix="no"]) ]) ]) dnl AX_CHECK_LIB_COMPILE(name, dependencies, function, [includes]) dnl tries to compile given test for a library dnl Note in difference to AC_SEARCH_LIBS this macro allowes approval of dnl API, too. dnl dnl if succeeds, found_[]name is set AC_DEFUN([AX_CHECK_LIB_COMPILE], [ define([Name],[patsubst(translit([$1],[./+-], [____]),[_*$])]) define([testcode], ifelse(x"regexp([$3], [[^a-zA-Z_]])", x"-1", [void *p = &$3], [$3])) AX_APPEND_TO_VAR([LIBS], ${Name[]_LIBS}) m4_ifnblank([$2], [AC_MSG_CHECKING([if lib[]$1[] can be linked with $2])], [AC_MSG_CHECKING([if lib[]$1[] can be linked alone])]) AC_LINK_IFELSE( [AC_LANG_PROGRAM([$4], [testcode])], [AC_MSG_RESULT([yes]) found_[]Name[]="yes"], [AC_MSG_RESULT([no])] ) LIBS="${ax_safe_libs}" ]) dnl _AX_DEFAULT_LINKEXT_REQUIREMENTS AC_DEFUN([_AX_DEFAULT_LINKEXT_REQUIREMENTS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AS_CASE(["$host"], [*-[[Hh]][[Pp]][[Uu]][[Xx]]*], [ax_linkext_default_shared=".sl"; ax_linkext_default_archive=".a"; ax_linkext_default_objext="$OBJEXT"], [*-[[Dd]][[Aa]][[Rr]][[Ww]][[Ii]][[Nn]]*], [ax_linkext_default_shared=".dylib"; ax_linkext_default_archive=".a"; ax_linkext_default_objext="$OBJEXT"], [ax_linkext_default_shared=".so"; ax_linkext_default_archive=".a"; ax_linkext_default_objext="$OBJEXT"]) ax_default_linkexts="$ax_linkext_default_shared:$ax_linkext_default_archive:$ax_linkext_default_objext" ])dnl AC_DEFUN([_AX_SEARCH_PATH], [${ax_with_lib[]$1[]_prefix} ${acl_final_exec_prefix} ${acl_final_prefix} ${PRODUKTDIR} /usr/pkg /opt/freeware /usr/local /usr]) dnl AX_CHECK_LIB_FLAGS(name, dependencies, function, [includes], dnl [pkg-config-module], [action-if-found], dnl [action-if-not-found]) dnl searches for lib[]name and the libraries corresponding to explicit and dnl implicit dependencies, together with the specified include files and dnl the ability to compile and link the specified function. dnl If found, action-if-found is run, action-if-not-found otherwise. dnl Action if found is to set and AC_SUBST HAVE_LIB${NAME}, LIBS_${NAME}, dnl and INC_${NAME} and run action-if-found when specified dnl Action if not found is to bail out with error when --with-${name} is dnl specified as configure flag or LIB${NAME} is mandatory dnl (ax_cv_with_lib${name} != "no" - see AX_CHECK_WITH_LIB) after dnl ran action-if-not-found when specified dnl dnl TODO support lib32/lib64 (libstem) dnl TODO support AC_SEARCH_LIBS like multiple libs in addition dnl TODO support other languages than C/C++ dnl TODO support re-run without unset ax_cv_found_lib[]Name for other dnl includes AC_DEFUN([AX_CHECK_LIB_FLAGS], [ dnl AC_REQUIRE([AC_LIB_RPATH]) dnl AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_PROG_GREP]) AC_REQUIRE([PKG_PROG_PKG_CONFIG]) AC_REQUIRE([_AX_DEFAULT_LINKEXT_REQUIREMENTS]) define([libtitle], m4_car($1)) define([libfiles], [m4_ifnblank(m4_cdr($1),m4_cdr($1),libtitle)]) AX_CHECK_WITH_LIB(libtitle,[check]) define([Name],[patsubst(translit(libtitle,[./+-], [____]),[_*$])]) define([NAME],[patsubst(translit(libtitle,[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____]),[_*$])]) define([header_file], [regexp([$4], [.*include[ ]+["<]\([^">]+\)[">].*], [\1])]) define([search_path], [_AX_SEARCH_PATH(Name)]) AS_IF( [test "x${ax_with_lib[]Name[]}" != "xno"], [ AS_VAR_SET_IF([ax_cv_found_lib[]Name], , [ AS_IF([test m4_ifnblank(header_file, ["x${Name[]_CFLAGS}" = "x" -a]) "x${Name[]_LIBS}" = "x"], [ m4_ifnblank(header_file, [ax_safe_cppflags="${CPPFLAGS}"]) ax_safe_libs="${LIBS}" m4_ifnblank([$5], [ ax_safe_pkg_config_path="${PKG_CONFIG_PATH}" PKG_CONFIG_PATH="" ax_pkg_config_path_sep="" for dir in search_path; do AS_IF([test -d "${dir}/lib/pkgconfig" -a -z "`AS_ECHO $PKG_CONFIG_PATH | $GREP ${dir}/lib/pkgconfig`"], [ PKG_CONFIG_PATH="${PKG_CONFIG_PATH}${ax_pkg_config_path_sep}${dir}/lib/pkgconfig" ax_pkg_config_path_sep=$PATH_SEPARATOR ]) done AS_IF([test -n "${ax_safe_pkg_config_path}"], [PKG_CONFIG_PATH="${PKG_CONFIG_PATH}${ax_pkg_config_path_sep}${ax_safe_pkg_config_path}"]) export PKG_CONFIG_PATH PKG_CHECK_MODULES(Name, [$5], [ m4_ifnblank(header_file, [AX_APPEND_TO_VAR([CPPFLAGS], ${Name[]_CFLAGS})]) AX_CHECK_LIB_COMPILE(libtitle, [flags from pkg-config], [$3], [$4]) ax_save_Name[]_LIBS="${Name[]_LIBS}" m4_ifnblank([$2], [ m4_foreach([libdep], [$2], [ AS_IF([test "x${found_[]Name[]}" != "xyes"], [ Name[]_LIBS="${ax_save_Name[]_LIBS} m4_normalize(m4_foreach_w([lib], libdep, [ -l[]lib]))" AX_CHECK_LIB_COMPILE(libtitle, [flags from pkg-config and "m4_normalize(m4_foreach_w([lib], libdep, [ -l[]lib]))"], [$3], [$4]) ]) ]) ]) ], [ found_[]Name[]_lib= ]) PKG_CONFIG_PATH="${ax_safe_pkg_config_path}" ]) ax_search_lib_path_checked=":" AS_IF([test "x_$found_[]Name" != "x_yes"], [ for dir in search_path; do AS_IF([test -d "${dir}" -a -z "`AS_ECHO $ax_search_lib_path_checked | $GREP :${dir}:`"], [ ax_search_lib_path_checked="${ax_search_lib_path_checked}${dir}:" AC_MSG_CHECKING([if lib[]libtitle[] is in $dir]) m4_ifnblank(header_file, [ found_[]Name[]_include= if test -f "$dir/include/[]header_file[]"; then found_[]Name[]_include="yes"; fi ]) m4_foreach_w([libnm], libfiles, [ define([libfnm],[patsubst(translit(libnm,[./+-], [____]),[_*$])]) found_[]libfnm[]_lib= if test -f "$dir/lib/lib[]libnm[]$ax_linkext_default_shared"; then found_[]libfnm[]_lib="yes"; elif test -f "$dir/lib/lib[]libnm[]$ax_linkext_default_archive"; then found_[]libfnm[]_lib="yes"; elif test -f "$dir/lib/[]libnm[]$ax_linkext_default_objext"; then found_[]libfnm[]_lib="yes"; fi ]) AS_IF( [test m4_ifnblank(header_file, ["x${found_[]Name[]_include}" != "x"], [true]) m4_foreach_w([libnm], libfiles, [define([libfnm],[patsubst(translit(libnm,[./+-], [____]),[_*$])]) -a "x${found_[]libfnm[]_lib}" != "x"])], [ AC_MSG_RESULT([yes]) m4_ifnblank(header_file, [ Name[]_CFLAGS="-I$dir/include" AX_APPEND_TO_VAR([CPPFLAGS], ${Name[]_CFLAGS}) ]) Name[]_LIBS="-L$dir/lib m4_normalize(m4_foreach_w([lib], libfiles, [ -l[]lib]))" AX_CHECK_LIB_COMPILE(libtitle, [], [$3], [$4]) AS_IF([test "x${found_[]Name[]}" = "xyes"], [break]) m4_ifnblank([$2], [ m4_foreach([libdep], [$2], [ Name[]_LIBS="-L$dir/lib m4_normalize(m4_foreach_w([lib], libfiles libdep, [ -l[]lib]))" AX_CHECK_LIB_COMPILE(libtitle, m4_normalize(m4_foreach_w([lib], libdep, [ -l[]lib])), [$3], [$4]) AS_IF([test "x${found_[]Name[]}" = "xyes"], [break]) ]) ]) ], [AC_MSG_RESULT([no])]) AS_IF([test "x${found_[]Name[]}" = "xyes"], [break]) m4_ifnblank(header_file, [CPPFLAGS="${ax_safe_cppflags}"]) ]) done ]) m4_ifnblank(header_file, [CPPFLAGS="${ax_safe_cppflags}"]) LIBS="${ax_safe_libs}" ax_cv_found_lib[]Name="${found_[]Name}" ], [ found_[]Name[]="yes" ax_cv_found_lib[]Name="${found_[]Name}" ]) ]) AS_IF( [test "x_$found_[]Name" != "x_yes"], [ $7 AS_IF([test "x${ax_with_lib[]Name[]}" = "xyes"],[AC_MSG_ERROR([Cannot find suitable lib[]libtitle library])]) ], [ AS_IF([test -n "${Name[]_CFLAGS}"], [ INC_[]NAME="" INC_[]NAME[]_SEP="" for incpm in ${Name[]_CFLAGS} do INC_[]NAME="${INC_[]NAME}${INC_[]NAME[]_SEP}${incpm}" INC_[]NAME[]_SEP=" " done dnl INC_[]NAME="${Name[]_CFLAGS}" AC_SUBST(INC_[]NAME) ]) LIBS_[]NAME="" LIBS_[]NAME[]_SEP="" for libpm in ${Name[]_LIBS} do LIBS_[]NAME="${LIBS_[]NAME}${LIBS_[]NAME[]_SEP}${libpm}" LIBS_[]NAME[]_SEP=" " done AC_SUBST(LIBS_[]NAME) HAVE_LIB[]NAME=yes AC_SUBST(HAVE_LIB[]NAME) $6 ]) ], [ $7 HAVE_LIB[]NAME= ] ) ]) libstatgrab-0.90/m4/lt~obsolete.m4000444 001750 001750 00000013756 12200045532 017053 0ustar00tdbusers000000 000000 # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) libstatgrab-0.90/m4/ltversion.m4000444 001750 001750 00000001262 12200045532 016513 0ustar00tdbusers000000 000000 # ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) libstatgrab-0.90/m4/ax_ncurses.m4000644 001750 001750 00000004047 12200025312 016640 0ustar00tdbusers000000 000000 dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/htmldoc/mp_with_curses.html dnl (Hacked by tdb for libstatgrab) dnl $Id$ AC_DEFUN([MP_WITH_CURSES], [ AC_ARG_WITH(ncurses, [ --without-ncurses Do not use ncurses],,) mp_save_LIBS="$LIBS" mp_save_CPPFLAGS="$CPPFLAGS" CURSES_LIB="" define([testcode], [chtype a; int b=A_STANDOUT, c=KEY_LEFT; initscr(); addchnstr(&a, b); move(b,c);]) AS_IF([test "x$with_ncurses" != "xno"], [ AC_CACHE_CHECK([for working ncurses], mp_cv_ncurses, [ LIBS="$mp_save_LIBS $SAIDARLIBS -lncurses" CPPFLAGS="$mp_save_CPPFLAGS $SAIDARCPPFLAGS" AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], [testcode])], [ mp_cv_ncurses="ncurses.h" CURSES_LIB="-lncurses" ], [ LIBS="$mp_save_LIBS $SAIDARLIBS -lncurses" CPPFLAGS="$mp_save_CPPFLAGS $SAIDARCPPFLAGS" AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], [testcode])], [ mp_cv_ncurses="ncurses/ncurses.h" CURSES_LIB="-lncurses" ], [ LIBS="$mp_save_LIBS $SAIDARLIBS -lcurses" CPPFLAGS="$mp_save_CPPFLAGS $SAIDARCPPFLAGS" AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], [testcode])], [ mp_cv_ncurses="curses.h" CURSES_LIB="-lcurses" ], [mp_cv_ncurses=no]) ]) ]) ]) ]) AS_IF([test ! "$CURSES_LIB"], [ AC_MSG_WARN([Unable to find curses or ncurses; disabling saidar]) AM_CONDITIONAL(SAIDAR, false) ], [test "$mp_cv_ncurses" = "ncurses.h"], [ AC_DEFINE([HAVE_NCURSES_H], 1, [Define to 1 if you have the header file.]) ], [test "$mp_cv_ncurses" = "ncurses/ncurses.h"], [ AC_DEFINE([HAVE_NCURSES_NCURSES_H], 1, [Define to 1 if you have the header file.]) ], [test "$mp_cv_ncurses" = "curses.h"], [ AC_DEFINE([HAVE_CURSES_H], 1, [Define to 1 if you have the header file.]) ]) SAIDARLIBS="$SAIDARLIBS $CURSES_LIB" LIBS="$mp_save_LIBS" CPPFLAGS="$mp_save_CPPFLAGS" ])dnl libstatgrab-0.90/m4/ax_pthread.m4000644 001750 001750 00000031323 12200025312 016602 0ustar00tdbusers000000 000000 # =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_pthread.html # =========================================================================== # # SYNOPSIS # # AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) # # DESCRIPTION # # This macro figures out how to build C programs using POSIX threads. It # sets the PTHREAD_LIBS output variable to the threads library and linker # flags, and the PTHREAD_CFLAGS output variable to any special C compiler # flags that are needed. (The user can also force certain compiler # flags/libs to be tested by setting these environment variables.) # # Also sets PTHREAD_CC to any special C compiler that is needed for # multi-threaded programs (defaults to the value of CC otherwise). (This # is necessary on AIX to use the special cc_r compiler alias.) # # NOTE: You are assumed to not only compile your program with these flags, # but also link it with them as well. e.g. you should link with # $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS # # If you are only building threads programs, you may wish to use these # variables in your default LIBS, CFLAGS, and CC: # # LIBS="$PTHREAD_LIBS $LIBS" # CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # CC="$PTHREAD_CC" # # In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant # has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name # (e.g. PTHREAD_CREATE_UNDETACHED on AIX). # # ACTION-IF-FOUND is a list of shell commands to run if a threads library # is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it # is not found. If ACTION-IF-FOUND is not specified, the default action # will define HAVE_PTHREAD. # # Please let the authors know if this macro fails on any platform, or if # you have any other suggestions or comments. This macro was based on work # by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help # from M. Frigo), as well as ac_pthread and hb_pthread macros posted by # Alejandro Forero Cuervo to the autoconf macro repository. We are also # grateful for the helpful feedback of numerous users. # # Updated for Autoconf 2.68 by Daniel Richard G. # # LICENSE # # Copyright (c) 2008 Steven G. Johnson # Copyright (c) 2011 Daniel Richard G. # # 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 . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 12 AU_ALIAS([AX_PTHREAD], [AX_PTHREAD]) AC_DEFUN([AX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_LANG_PUSH([C]) ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) AC_TRY_LINK_FUNC(pthread_join, ax_pthread_ok=yes) AC_MSG_RESULT($ax_pthread_ok) if test x"$ax_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items starting with a "-" are # C compiler flags, and other items are library names, except for "none" # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. ax_pthread_flags="-Kthread -kthread lthread -pthread -pthreads -mt -mthreads --thread-safe pthread-config pthreads pthread" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # none will prepended at OS modifications below # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) # -pthreads: Solaris/gcc # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads too; # also defines -D_REENTRANT) # ... -mt is also the pthreads flag for HP/aCC # -mthreads: Mingw32/gcc, Lynx/gcc # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) # pthread: Linux, etcetera # pthreads: AIX (very old gcc's on AIX must check this before -lpthread, # handled below) # In general, linking only is moved at the end of all tests case "${host_cpu}-${host_os}" in *solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (We need to link with -pthreads/-mt/ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather # a function called by this macro, so we could check for that, but # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: ax_pthread_flags="-mt -pthread $ax_pthread_flags" if test x"$GCC" = xyes; then ax_pthread_flags="-pthreads pthread -pthread $ax_pthread_flags" fi ;; *hp-ux*) # On HP-UX compiling with aCC, cc understands -mthreads as '-mt' # '-hreads' ..., the test succeeds but it fails to run. # '-mt' must be checked first if test x"$GCC" != xyes; then ax_pthread_flags="-mt $ax_pthread_flags" fi ;; *-darwin*) ax_pthread_flags="-pthread $ax_pthread_flags" ;; *-aix*) # On AIX (at least, for some gcc-versions), -lpthreads works for C # only, so link-based tests will erroneously succeed from C++ point # of view. (We need to link with -pthread to use the right runtime # libraries.) But there're old gcc versions known to fail for this # ... so, we'll just look for -lpthreads first for them: ax_pthread_flags="-pthread pthreads $ax_pthread_flags" ;; esac case "${host_cpu}-${host_os}" in *solaris*) ;; *) ax_pthread_flags="none $ax_pthread_flags" ;; esac if test x"$ax_pthread_ok" = xno; then for flag in $ax_pthread_flags; do case $flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; -*) AC_MSG_CHECKING([whether pthreads work with $flag]) PTHREAD_CFLAGS="$flag" ;; pthread-config) AC_CHECK_PROG(ax_pthread_config, pthread-config, yes, no) if test x"$ax_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) AC_MSG_CHECKING([for the pthreads library -l$flag]) PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. AC_LINK_IFELSE([AC_LANG_PROGRAM([#include static void routine(void *a) { a = 0; } static void *start_routine(void *a) { return a; }], [pthread_t th; pthread_attr_t attr; pthread_create(&th, 0, start_routine, 0); pthread_join(th, 0); pthread_attr_init(&attr); pthread_cleanup_push(routine, 0); pthread_cleanup_pop(0) /* ; */])], [ax_pthread_ok=yes], []) LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" AC_MSG_RESULT($ax_pthread_ok) if test "x$ax_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Various other checks: if test "x$ax_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. AC_MSG_CHECKING([for joinable pthread attribute]) attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], [int attr = $attr; return attr /* ; */])], [attr_name=$attr; break], []) done AC_MSG_RESULT($attr_name) if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, [Define to necessary symbol if this constant uses a non-standard name on your system.]) fi AC_MSG_CHECKING([if more special flags are required for pthreads]) flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; esac AC_MSG_RESULT(${flag}) if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: must compile with xlc_r or cc_r if test x"$GCC" != xyes; then AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) AC_CHECK_PROGS(PTHREAD_CXX, xlC_r CC_r, ${CXX}) else PTHREAD_CC="$CC" PTHREAD_CXX="$CXX" fi else PTHREAD_CC="$CC" PTHREAD_CXX="$CXX" fi AC_SUBST(PTHREAD_LIBS) AC_SUBST(PTHREAD_CFLAGS) AC_SUBST(PTHREAD_CC) AC_SUBST(PTHREAD_CXX) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$ax_pthread_ok" = xyes; then ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) : else ax_pthread_ok=no $2 fi AC_LANG_RESTORE ])dnl AX_PTHREAD libstatgrab-0.90/m4/ax_perl5.m4000644 001750 001750 00000004764 12200025312 016213 0ustar00tdbusers000000 000000 dnl Find a suitable perl5 interpreter and perl modules dnl dnl Motivation: mixing perl tests into autoconf based distribution dnl dnl Jens Rehsack AC_DEFUN([_AX_BUILD_MODULE_TEST_CODE], [define( [ModuleName],m4_ifval(regexp([$1], [^\([^ ]+\)[ ]+\(.*\)$], [\1]),regexp([$1], [^\([^ ]+\)[ ]+\(.*\)$], [\1]),$1))define( [ModuleVersion],regexp([$1], [^\([^ ]+\)[ ]+\(.*\)$], [\2]))m4_map([m4_echo], [ [-e 'use ModuleName;], [m4_ifval(ModuleVersion, [ ModuleName->VERSION() > ModuleVersion or die "ModuleName ModuleVersion required--this is only " . ModuleName->VERSION();])], [' ]])]) AC_DEFUN([_AX_PROG_PERL_ARGS], [ AC_ARG_WITH([perl5], [ --with-perl5[[=/path/to/perl5]] --without-perl5], [$as_test_x "$withval" && ax_perl5_prog="$withval"]) ]) dnl AX_PROG_PERL5([INTERPRETER-LIST], [INCLUDE-PATH], [MINIMUM-VERSION], dnl [MODULE-LIST], [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl Declares configure options dnl --with-perl5[=/path/to/perl5] dnl --without-perl5 dnl If neither --with-perl5 nor --without-perl5 is specified for configure dnl run, the path is searched for binaries named 'perl5' or 'perl' AC_DEFUN([AX_PROG_PERL5], [ AC_REQUIRE([AC_PROG_GREP]) AC_REQUIRE([AC_PROG_SED]) AC_REQUIRE([_AX_PROG_PERL_ARGS]) AC_CACHE_CHECK([for applicable perl5 interpreter], [ax_cv_perl5_prog], [ define([PERL5_INTERPRETER_LIST], m4_ifnblank([$1], $1, [perl5 perl])) define([PERL5_INCLUDES], m4_ifnblank([$2], m4_combine([ ], [-I], [], m4_do([m4_echo], m4_split([$2]))))) define([PERL5_VERSION_CHECK], m4_ifnblank([$3], [-e 'use $3;'])) define([PERL5_MODULES_CHECK], [m4_ifnblank([$4], m4_map_args_sep([_AX_BUILD_MODULE_TEST_CODE(], [)], [], $4))]) define([PERL5_CMDLINE], m4_normalize( m4_join([ ], PERL5_INCLUDES, PERL5_VERSION_CHECK, PERL5_MODULES_CHECK, [-V]))) AC_PATH_PROGS_FEATURE_CHECK([ax_perl5_prog], PERL5_INTERPRETER_LIST, [ output=`$ac_path_ax_perl5_prog PERL5_CMDLINE 2>/dev/null` AS_IF( [test $? -eq 0], [ ax_perl5_prog=m4_ifnblank( [PERL5_INCLUDES], "$ac_path_ax_perl5_prog PERL5_INCLUDES", "$ac_path_ax_perl5_prog" ) ac_cv_path_ax_perl5_prog="$ax_perl5_prog" ac_path_ax_perl5_prog_found=: ]) ], [ax_perl5_prog="none"]) ax_cv_perl5_prog="$ax_perl5_prog" undefine([PERL5_INTERPRETER_LIST]) undefine([PERL5_INCLUDES]) undefine([PERL5_VERSION_CHECK]) undefine([PERL5_MODULES_CHECK]) undefine([PERL5_CMDLINE]) ]) PERL5="$ax_cv_perl5_prog" AC_SUBST(PERL5) m4_ifnblank([$5], [AS_IF([test "x$PERL5" != "xnone"], $5, $6)]) ]) libstatgrab-0.90/m4/ax_shellvars.m4000755 001750 001750 00000004004 12200025312 017155 0ustar00tdbusers000000 000000 dnl AX_VAR_CONTAINS_IF_ELSE(VAR, ELEMENT, IF-CONTAINED, IF-NOT-CONTAINED) dnl runs IF-CONTAINED when $VAR containes ELEMENT, IF-NOT-CONTAINED otherwise dnl dnl Works only for vars like CPPFLAGS, not for LIB* variables because that dnl sometimes contains two or three consecutive elements that belong together. AC_DEFUN([AX_VAR_CONTAINS_IF_ELSE], [ ax_var_contains_found= for x in $[$1]; do AS_IF([test "X$x" = "X$2"], [ ax_var_contains_found=yes break]) done AS_IF([test -n "$ax_var_contains_found"], $3, $4) ]) dnl AX_VAR_CONTAINS_ANY_IF_ELSE(VAR, LIST, IF-CONTAINED, IF-NOT-CONTAINED) dnl runs IF-CONTAINED when $VAR containes at least one element of LIST, dnl IF-NOT-CONTAINED otherwise dnl Works only for vars like CPPFLAGS, not for LIB* variables because that dnl sometimes contains two or three consecutive elements that belong together. AC_DEFUN([AX_VAR_CONTAINS_ANY_IF_ELSE], [ ax_var_contains_any_found= for element in [$2]; do AX_VAR_CONTAINS_IF_ELSE([$1], [$element], [ ax_var_contains_any_found=yes break]) done AS_IF([test -n "$ax_var_contains_any_found"], $3, $4) ]) dnl AX_APPEND_TO_VAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, dnl unless already present in VAR. dnl Works only for vars like CPPFLAGS, not for LIB* variables because that dnl sometimes contains two or three consecutive elements that belong together. AC_DEFUN([AX_APPEND_TO_VAR], [ for element in [$2]; do AX_VAR_CONTAINS_IF_ELSE([$1], [$element], , [ [$1]="${[$1]}${[$1]:+ }$element" ]) done ]) dnl AX_REMOVE_FROM_VAR(VAR, CONTENTS) removes the elements of CONTENTS from VAR. dnl Works only for vars like CPPFLAGS, not for LIB* variables because that dnl sometimes contains two or three consecutive elements that belong together. AC_DEFUN([AX_REMOVE_FROM_VAR], [ for element in [$2]; do [ax_save_$1]="${[$1]}" for x in $[ax_save_$1]; do AS_IF([test "X$x" != "X$element"], [[$1]="${[$1]}${[$1]:+ }$element"]) done done ]) libstatgrab-0.90/m4/ax_types.m4000644 001750 001750 00000014017 12200025312 016320 0ustar00tdbusers000000 000000 dnl check for type specific behavior dnl dnl Motivation: portable format modifier support, reduce warnings for alignment calculation etc. dnl dnl Jens Rehsack dnl make requirement AC_TYPE_TIME_T happy AN_IDENTIFIER([time_t], [AC_TYPE_TIME_T]) AC_DEFUN([AC_TYPE_TIME_T], [AC_CHECK_TYPE([time_t], [long int], [], [], [#ifdef TIME_WITH_SYS_TIME # include # include #else # ifdef HAVE_SYS_TIME_H # include # else # include # endif #endif])]) dnl make requirement AC_TYPE_GID_T happy AU_ALIAS([AC_TYPE_GID_T], [AC_TYPE_UID_T]) dnl Find a printf/scanf format pattern for given type dnl dnl Motivation: get rid of error messages of wrong types when printing dnl process id's and similar dnl dnl Jens Rehsack dnl AX_ENABLE_DIECT_TYPE_FMT_SEARCH(DEFAULT-CONTENT) dnl enables searching for type format options instead of trying defaults are working AC_DEFUN([AX_ENABLE_DIECT_TYPE_FMT_SEARCH], [ AC_ARG_ENABLE([direct-format-search], [ --enable-direct-format-search[[=list]] enables direct searching for printf/scantf format search, skipping default checking --disable-direct-format-search disables direct format string searching], [ENABLE_DIRECT_TYPE_FMT_SEARCH="$enableval"], [ENABLE_DIRECT_TYPE_FMT_SEARCH="$1"]) ]) dnl _AX_CHECK_TYPE_SIGN_CHECK([check type], [includes]) AC_DEFUN([_AX_CHECK_TYPE_SIGN_CHECK], [AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT([$2])], [ /* signed: -1 / 2 -> 0 * 0 % 4 -> 0 * 0 - 1 -> -1 * unsigned: 0xff / 2 -> 0x7f * 0x7f % 4 -> 3 * 3 - 1 -> 2 */ int fmtchk[[((($1)-1)/2)%4-1]]; unsigned fcs = sizeof(fmtchk); printf("%u\n", fcs); /* avoid -Wunused ... */ ]) ]) dnl _AX_CHECK_TYPE_SIZE_CMP([check type], [built-in type], [includes]) AC_DEFUN([_AX_CHECK_TYPE_SIZE_CMP], [AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT([$3])], [int sizechk[[(sizeof($1) == sizeof($2)) * 2 - 1]]; unsigned scs = sizeof(sizechk); printf("%u\n", scs); /* avoid -Wunused ... */ ]) ]) dnl _AX_CHECK_TYPE_FMT([type], [modifier], [includes]) AC_DEFUN([_AX_CHECK_TYPE_FMT], [AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT([$3])], [$1 test$1; sscanf("1234567890", "$2", &test$1); printf("$2\n", test$1);]) ]) dnl _AX_CHECK_TYPE_FMT([type], [includes]) AC_DEFUN([_AX_SEARCH_TYPE_FMT], [ define([Name],[translit([$1], [ ], [_])]) AC_COMPILE_IFELSE([_AX_CHECK_TYPE_SIGN_CHECK([$1], [$2])], [ AC_COMPILE_IFELSE([_AX_CHECK_TYPE_SIZE_CMP([$1], [unsigned int], [$2])], [ AC_COMPILE_IFELSE([_AX_CHECK_TYPE_FMT([$1], [%u], [$2])], [ax_cv_type_fmt_[]Name[]="%u"])]) AS_IF([test ! "$ax_cv_type_fmt_[]Name"], [ AC_COMPILE_IFELSE([_AX_CHECK_TYPE_SIZE_CMP([$1], [unsigned long], [$2])], [ AC_COMPILE_IFELSE([_AX_CHECK_TYPE_FMT([$1], [%lu], [$2])], [ax_cv_type_fmt_[]Name[]="%lu"])])]) AS_IF([test ! "$ax_cv_type_fmt_[]Name"], [ AC_COMPILE_IFELSE([_AX_CHECK_TYPE_SIZE_CMP([$1], [unsigned long long], [$2])], [ AC_COMPILE_IFELSE([_AX_CHECK_TYPE_FMT([$1], [%llu], [$2])], [ax_cv_type_fmt_[]Name[]="%llu"])])]) ], [ AC_COMPILE_IFELSE([_AX_CHECK_TYPE_SIZE_CMP([$1], [int], [$2])], [ AC_COMPILE_IFELSE([_AX_CHECK_TYPE_FMT([$1], [%d], [$2])], [ax_cv_type_fmt_[]Name[]="%d"])]) AS_IF([test ! "$ax_cv_type_fmt_[]Name"], [ AC_COMPILE_IFELSE([_AX_CHECK_TYPE_SIZE_CMP([$1], [long], [$2])], [ AC_COMPILE_IFELSE([_AX_CHECK_TYPE_FMT([$1], [%ld], [$2])], [ax_cv_type_fmt_[]Name[]="%ld"])])]) AS_IF([test ! "$ax_cv_type_fmt_[]Name"], [ AC_COMPILE_IFELSE([_AX_CHECK_TYPE_SIZE_CMP([$1], [long long], [$2])], [ AC_COMPILE_IFELSE([_AX_CHECK_TYPE_FMT([$1], [%lld], [$2])], [ax_cv_type_fmt_[]Name[]="%lld"])])]) ]) ]) dnl AX_CHECK_TYPE_FMT([type], [modifier], [includes]) AC_DEFUN([AX_CHECK_TYPE_FMT], [ define([Name],[translit([$1], [ ], [_])]) define([NAME],[translit([$1], [ abcdefghijklmnopqrstuvwxyz], [_ABCDEFGHIJKLMNOPQRSTUVWXYZ])]) AC_REQUIRE([AC_TYPE_][]NAME)dnl ifelse([], [$2], , [AC_REQUIRE([AX_ENABLE_DIECT_TYPE_FMT_SEARCH])]) AC_CACHE_CHECK([for format string for $1], [ax_cv_type_fmt_]Name, [ ax_save_[]_AC_LANG_ABBREV[]_werror_flag="$ac_[]_AC_LANG_ABBREV[]_werror_flag" AC_LANG_WERROR() ifelse([], [$2], , [ AX_VAR_CONTAINS_ANY_IF_ELSE([ENABLE_DIRECT_TYPE_FMT_SEARCH], [yes $1], , [ m4_foreach_w([AX_Fmt], [$2], [AS_IF([test ! "$ax_cv_type_fmt_[]Name"], [AC_COMPILE_IFELSE([_AX_CHECK_TYPE_FMT([$1], [AX_Fmt], [$3])], [ax_cv_type_fmt_[]Name[]="AX_Fmt"])])]) ])]) AS_IF([test ! "$ax_cv_type_fmt_[]Name"], [_AX_SEARCH_TYPE_FMT([$1], [$3])]) ac_[]_AC_LANG_ABBREV[]_werror_flag="$ax_save_[]_AC_LANG_ABBREV[]_werror_flag" ]) AS_IF([test ! "$ax_cv_type_fmt_[]Name"], [AC_MSG_WARN([Unable to find format string for $1])], [AC_DEFINE_UNQUOTED([FMT_[]NAME], ["$ax_cv_type_fmt_[]Name"], [Define FMT string for $1])]) ]) dnl AX_CHECK_TYPES_FMT([types], [includes]) AC_DEFUN([AX_CHECK_TYPES_FMT], [m4_foreach_w([AX_Type], [$1], [ AX_CHECK_TYPE_FMT(AX_Type, , [$2])])]) AC_DEFUN([AX_CHECK_ALIGNOF], [ define([Name],[translit([$1], [ ], [_])]) define([NAME],[translit([$1], [ abcdefghijklmnopqrstuvwxyz], [_ABCDEFGHIJKLMNOPQRSTUVWXYZ])]) AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT]) AC_CACHE_CHECK([whether $1 needs alignment helper], [ax_cv_alignment_helper_]Name, [ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT([$2]) #if defined(__ICC) && defined(offsetof) # undef offsetof #endif #ifndef offsetof # define offsetof(type,memb) ((unsigned)(((char *)(&((type*)0)->memb)) - ((char *)0))) #endif typedef struct { $1 a; #ifdef HAVE_UNSIGNED_LONG_LONG_INT unsigned long long b; #else size_t b; #endif } ax_type_alignof_;], [int __ax_alignof[[(offsetof(ax_type_alignof_, b) == (unsigned long)((($1 *)0)+1)) * 2 - 1]]; unsigned acs = sizeof(__ax_alignof); printf("%u\n", acs); /* avoid -Wunused ... */] )], [ax_cv_alignment_helper_[]Name[]="no"], [ax_cv_alignment_helper_[]Name[]="yes"]) ]) AS_IF([test "$ax_cv_alignment_helper_[]Name" = "no"], [AC_DEFINE([NAME[]_ALIGN_OK], [1], [Defined with a true value when $1 is well aligned])]) ]) libstatgrab-0.90/m4/ax_xopen.m4000644 001750 001750 00000010777 12200025312 016316 0ustar00tdbusers000000 000000 dnl Figure out what flags must be set for maximum _XOPEN_SOURCE support dnl dnl Jens Rehsack dnl dnl Covered: dnl XPG5 - X/Open CAE Specification, Issue 5 (XPG5/UNIX 98/SUSv2) dnl XPG6 - Open Group Technical Standard, Issue 6 (XPG6/UNIX 03/SUSv3) dnl dnl TODO: really check for _XOPEN_SOURCE (XPG3), XOPEN_SOURCE = 4 (XPG4) dnl and _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED = 1 (XPG4v2) AC_DEFUN([AX_TRY_COMPILE_XOPEN_SOURCE], [ AC_COMPILE_IFELSE( [$1], [ HAVE_XOPEN_SOURCE_LEVEL="$3" HAVE_XOPEN_SOURCE="$4" NEED_DEFINE_XOPEN_SOURCE=0 ], [ ax_safe_cppflags="${CPPFLAGS}" CPPFLAGS="${CPPFLAGS} $2" AC_COMPILE_IFELSE( [$1], [ HAVE_XOPEN_SOURCE_LEVEL="$3" HAVE_XOPEN_SOURCE="$4" NEED_DEFINE_XOPEN_SOURCE=1 ] ) CPPFLAGS="${ax_safe_cppflags}" ] ) ]) AC_DEFUN([AX_CHECK_XOPEN_SOURCE], [ dnl Checks for header files. AC_REQUIRE([AC_HEADER_STDC]) define(xpg7_testcode, [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #include #include #include #include #include int main () { int rc, i; struct dirent *d1 = NULL, *d2 = NULL; char *s1 = NULL, *s2 = NULL, *s3 = NULL; FILE *f = NULL; size_t len = 1024; ssize_t si; rc = alphasort( &d1, &d2 ); rc = faccessat( 1, s1, R_OK, AT_EACCESS ); rc = fexecve( 1, &s1, &s2 ); f = fmemopen( s1, 1024, s2 ); si = getdelim( &s1, &len, ' ', f ); si = getline( &s1, &len, f ); s3 = stpcpy( s1, s2 ); s3 = stpncpy( s1, s2, len ); len = strnlen( s1, 1024 ); s2 = strndup( s1, 1024 ); s1 = strsignal( SIGINT ); return 0; } ])]) define(xpg6_testcode, [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #include int main () { int rc; char *s1 = NULL, *s2 = NULL; rc = setenv( s1, s2, 0 ); rc = setegid( 0 ); rc = seteuid( 0 ); return 0; } ])]) define(xpg52_testcode, [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #include int main () { int rc; char *s1 = NULL, *s2 = NULL; const char *addr; char addr_str[[64]]; struct sockaddr_in sock_buf; rc = inet_pton( AF_INET, "127.0.0.1", &sock_buf ); addr = inet_ntop( AF_INET, &sock_buf, addr_str, sizeof(addr_str) ); return 0; } ])]) define(xpg5_testcode, [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #include #include int main () { int rc; struct utmpx *utent; rc = ftruncate( 1, 1024 ); rc = fsync( 1 ); setutxent(); utent = getutxent(); endutxent(); return 0; } ])]) define(xpg42_testcode, [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #include #include int main () { char buf[[1024]]; size_t sz = sizeof(buf); int rc; struct rlimit rl; rc = gethostname( buf, sz ); rc = getrlimit( RLIMIT_CORE, &rl ); return 0; } ])]) define(xpg4_testcode, [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #include #include int main (int argc, char **argv) { size_t len; char buf[[1024]]; int ch, status = 0; pid_t child = 100; len = confstr( 1, buf, sizeof(buf ) ); ch = getopt( argc, argv, "h" ); rc = waitpid( child, &status, WNOHANG ); return 0; } ])]) define(xpg3_testcode, [AC_LANG_SOURCE([ AC_INCLUDES_DEFAULT #include int main () { int rc; rc = nice( 5 ); rc = chroot( "/tmp" ); return 0; } ])]) AC_MSG_CHECKING([which _XOPEN_SOURCE macro must be defined]) AX_TRY_COMPILE_XOPEN_SOURCE([xpg3_testcode], [-D_XOPEN_SOURCE], 300, [XPG3]) AX_TRY_COMPILE_XOPEN_SOURCE([xpg4_testcode], [-D_XOPEN_SOURCE=4], 400, [XPG4]) AX_TRY_COMPILE_XOPEN_SOURCE([xpg42_testcode], [-D_XOPEN_SOURE -D_XOPEN_SOURCE_EXTENDED], 420, [XPG4.2]) AX_TRY_COMPILE_XOPEN_SOURCE([xpg5_testcode], [-D_XOPEN_SOURE=500], 500, [XPG5]) AX_TRY_COMPILE_XOPEN_SOURCE([xpg52_testcode], [-D_XOPEN_SOURE=520], 520, [XPG5.2]) AX_TRY_COMPILE_XOPEN_SOURCE([xpg6_testcode], [-D_XOPEN_SOURE=600], 600, [XPG6]) AX_TRY_COMPILE_XOPEN_SOURCE([xpg7_testcode], [-D_XOPEN_SOURE=700], 700, [XPG7]) AS_IF( [test "${NEED_DEFINE_XOPEN_SOURCE}" -eq "1"], [AS_IF( [test "X${HAVE_XOPEN_SOURCE}" = "XEXTENDED"], [ dnl Need to define this manually for XPG42 XOPEN_SOURCE_CPPFLAGS="-D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED" ], [ dnl Need to enable this manually XOPEN_SOURCE_CPPFLAGS="-D_XOPEN_SOURCE=${HAVE_XOPEN_SOURCE}" ] AC_MSG_RESULT([$XOPEN_SOURCE_CPPFLAGS]) )], [ AC_MSG_RESULT([none ($HAVE_XOPEN_SOURCE)]) ] ) AC_DEFINE_UNQUOTED([HAVE_XOPEN_SOURCE], $HAVE_XOPEN_SOURCE_LEVEL, [_XOPEN_SOURCE $HAVE_XOPEN_SOURCE]) ]) libstatgrab-0.90/m4/libtool.m4000444 001750 001750 00001057216 12200045532 016145 0ustar00tdbusers000000 000000 # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS libstatgrab-0.90/examples/os_info.c000644 001750 001750 00000004707 12200025312 017325 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id$ */ #include #include #include #include #include "helpers.h" #ifndef lengthof #define lengthof(x) (sizeof(x)/sizeof((x)[0])) #endif static const char *host_states[] = { "unknown", "physical host", "virtual machine (full virtualized)", "virtual machine (paravirtualized)", "hardware virtualization" }; int main(int argc, char **argv){ sg_host_info *general_stats; /* Initialise helper - e.g. logging, if any */ sg_log_init("libstatgrab-examples", "SGEXAMPLES_LOG_PROPERTIES", argc ? argv[0] : NULL); /* Initialise statgrab */ sg_init(1); /* Drop setuid/setgid privileges. */ if (sg_drop_privileges() != SG_ERROR_NONE) sg_die("Error. Failed to drop privileges", 1); general_stats = sg_get_host_info(NULL); if(general_stats == NULL) sg_die("Failed to get os stats", 1); printf("OS name : %s\n", general_stats->os_name); printf("OS release : %s\n", general_stats->os_release); printf("OS version : %s\n", general_stats->os_version); printf("Hardware platform : %s\n", general_stats->platform); printf("Machine nodename : %s\n", general_stats->hostname); printf("Machine uptime : %lld\n", (long long)general_stats->uptime); printf("Number of CPU's configured : %u\n", general_stats->maxcpus); printf("Number of CPU's online : %u\n", general_stats->ncpus); printf("Kernel bitwidth : %u\n", general_stats->bitwidth); printf("Host state : %s\n", ((size_t)general_stats->host_state) > (lengthof(host_states) - 1) ? "unexpected state (libstatgrab to new)" : host_states[general_stats->host_state] ); exit(0); } libstatgrab-0.90/examples/Makefile.am000644 001750 001750 00000001231 12200025312 017546 0ustar00tdbusers000000 000000 # Makefile for libstatgrab/examples # http://www.i-scream.org/libstatgrab/ # $Id$ if EXAMPLES noinst_PROGRAMS = network_traffic disk_traffic cpu_usage load_stats \ process_stats os_info vm_stats user_list page_stats \ network_iface_stats process_snapshot filesys_snapshot \ valid_filesystems endif # BUILT_HEADERS = helpers.h EXTRA_network_traffic_SOURCES = helpers.c helpers.h AM_CPPFLAGS = -I$(top_srcdir) -I$(top_builddir)\ -I$(top_srcdir)/src -I$(top_builddir)/src\ -I$(top_srcdir)/src/libstatgrab -I$(top_builddir)/src/libstatgrab \ @CLIBFLAGS@ LDADD = $(top_builddir)/src/libstatgrab/libstatgrab.la helpers.o @LINKFLAGS@ libstatgrab-0.90/examples/load_stats.c000644 001750 001750 00000003602 12200025312 020017 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id$ */ #include #include #include #include #include "helpers.h" static int quit; int main(int argc, char **argv){ extern char *optarg; int c; int delay = 1; sg_load_stats *load_stat; while ((c = getopt(argc, argv, "d:")) != -1){ switch (c){ case 'd': delay = atoi(optarg); break; } } /* Initialise helper - e.g. logging, if any */ sg_log_init("libstatgrab-examples", "SGEXAMPLES_LOG_PROPERTIES", argc ? argv[0] : NULL); /* Initialise statgrab */ sg_init(1); register_sig_flagger( SIGINT, &quit ); /* Drop setuid/setgid privileges. */ if (sg_drop_privileges() != SG_ERROR_NONE) sg_die("Error. Failed to drop privileges", 1); if ((load_stat = sg_get_load_stats(NULL)) == NULL) sg_die("Failed to get load stats", 1); while( (load_stat = sg_get_load_stats(NULL)) != NULL){ int ch; printf("Load 1 : %5.2f\t Load 5 : %5.2f\t Load 15 : %5.2f\n", load_stat->min1, load_stat->min5, load_stat->min15); ch = inp_wait(delay); if( quit || (ch == 'q') ) break; } exit(0); } libstatgrab-0.90/examples/user_list.c000644 001750 001750 00000003733 12200025312 017700 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id$ */ #include #include #include #include #include "helpers.h" int main(int argc, char **argv){ size_t nusers, x; sg_user_stats *users; #if 0 int c; int delay = 1; while ((c = getopt(argc, argv, "d:")) != -1){ switch (c){ case 'd': delay = atoi(optarg); break; } } #endif /* Initialise helper - e.g. logging, if any */ sg_log_init("libstatgrab-examples", "SGEXAMPLES_LOG_PROPERTIES", argc ? argv[0] : NULL); /* Initialise statgrab */ sg_init(1); /* Drop setuid/setgid privileges. */ if (sg_drop_privileges() != SG_ERROR_NONE) sg_die("Error. Failed to drop privileges", 1); users = sg_get_user_stats(&nusers); if( users == NULL ) sg_die("Failed to get logged on users", 1); printf( "%16s %16s %24s %8s %24s\n", "login name", "device", "hostname", "pid", "login time" ); for( x = 0; x < nusers; ++x ) { char ltbuf[256]; struct tm *tm; tm = localtime(&users[x].login_time); strftime(ltbuf, sizeof(ltbuf), "%c", tm); printf( "%16s %16s %24s %8d %24s\n", users[x].login_name, users[x].device, users[x].hostname, (int) users[x].pid, ltbuf ); } exit(0); } libstatgrab-0.90/examples/vm_stats.c000644 001750 001750 00000004170 12200025312 017523 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id$ */ #include #include #include #include #include "helpers.h" int main(int argc, char **argv){ sg_mem_stats *mem_stats; sg_swap_stats *swap_stats; long long total, free; /* Initialise helper - e.g. logging, if any */ sg_log_init("libstatgrab-examples", "SGEXAMPLES_LOG_PROPERTIES", argc ? argv[0] : NULL); /* Initialise statgrab */ sg_init(1); /* Drop setuid/setgid privileges. */ if (sg_drop_privileges() != SG_ERROR_NONE) sg_die("Error. Failed to drop privileges", 1); if( ((mem_stats = sg_get_mem_stats(NULL)) != NULL) && ((swap_stats = sg_get_swap_stats(NULL)) != NULL) ) { printf("Total memory in bytes : %llu\n", mem_stats->total); printf("Used memory in bytes : %llu\n", mem_stats->used); printf("Cache memory in bytes : %llu\n", mem_stats->cache); printf("Free memory in bytes : %llu\n", mem_stats->free); printf("Swap total in bytes : %llu\n", swap_stats->total); printf("Swap used in bytes : %llu\n", swap_stats->used); printf("Swap free in bytes : %llu\n", swap_stats->free); total = mem_stats->total + swap_stats->total; free = mem_stats->free + swap_stats->free; printf("Total VM usage : %5.2f%%\n", 100 - (((float)total/(float)free))); } else { sg_die("Unable to get VM stats", 1); } exit(0); } libstatgrab-0.90/examples/Makefile.in000644 001750 001750 00000056463 12200045540 017605 0ustar00tdbusers000000 000000 # Makefile.in generated by automake 1.12.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile for libstatgrab/examples # http://www.i-scream.org/libstatgrab/ # $Id$ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @EXAMPLES_TRUE@noinst_PROGRAMS = network_traffic$(EXEEXT) \ @EXAMPLES_TRUE@ disk_traffic$(EXEEXT) cpu_usage$(EXEEXT) \ @EXAMPLES_TRUE@ load_stats$(EXEEXT) process_stats$(EXEEXT) \ @EXAMPLES_TRUE@ os_info$(EXEEXT) vm_stats$(EXEEXT) \ @EXAMPLES_TRUE@ user_list$(EXEEXT) page_stats$(EXEEXT) \ @EXAMPLES_TRUE@ network_iface_stats$(EXEEXT) \ @EXAMPLES_TRUE@ process_snapshot$(EXEEXT) \ @EXAMPLES_TRUE@ filesys_snapshot$(EXEEXT) \ @EXAMPLES_TRUE@ valid_filesystems$(EXEEXT) subdir = examples DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_lib.m4 \ $(top_srcdir)/m4/ax_ncurses.m4 $(top_srcdir)/m4/ax_perl5.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_shellvars.m4 $(top_srcdir)/m4/ax_types.m4 \ $(top_srcdir)/m4/ax_visibility.m4 $(top_srcdir)/m4/ax_win32.m4 \ $(top_srcdir)/m4/ax_xopen.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) cpu_usage_SOURCES = cpu_usage.c cpu_usage_OBJECTS = cpu_usage.$(OBJEXT) cpu_usage_LDADD = $(LDADD) cpu_usage_DEPENDENCIES = \ $(top_builddir)/src/libstatgrab/libstatgrab.la helpers.o disk_traffic_SOURCES = disk_traffic.c disk_traffic_OBJECTS = disk_traffic.$(OBJEXT) disk_traffic_LDADD = $(LDADD) disk_traffic_DEPENDENCIES = \ $(top_builddir)/src/libstatgrab/libstatgrab.la helpers.o filesys_snapshot_SOURCES = filesys_snapshot.c filesys_snapshot_OBJECTS = filesys_snapshot.$(OBJEXT) filesys_snapshot_LDADD = $(LDADD) filesys_snapshot_DEPENDENCIES = \ $(top_builddir)/src/libstatgrab/libstatgrab.la helpers.o load_stats_SOURCES = load_stats.c load_stats_OBJECTS = load_stats.$(OBJEXT) load_stats_LDADD = $(LDADD) load_stats_DEPENDENCIES = \ $(top_builddir)/src/libstatgrab/libstatgrab.la helpers.o network_iface_stats_SOURCES = network_iface_stats.c network_iface_stats_OBJECTS = network_iface_stats.$(OBJEXT) network_iface_stats_LDADD = $(LDADD) network_iface_stats_DEPENDENCIES = \ $(top_builddir)/src/libstatgrab/libstatgrab.la helpers.o network_traffic_SOURCES = network_traffic.c network_traffic_OBJECTS = network_traffic.$(OBJEXT) network_traffic_LDADD = $(LDADD) network_traffic_DEPENDENCIES = \ $(top_builddir)/src/libstatgrab/libstatgrab.la helpers.o os_info_SOURCES = os_info.c os_info_OBJECTS = os_info.$(OBJEXT) os_info_LDADD = $(LDADD) os_info_DEPENDENCIES = $(top_builddir)/src/libstatgrab/libstatgrab.la \ helpers.o page_stats_SOURCES = page_stats.c page_stats_OBJECTS = page_stats.$(OBJEXT) page_stats_LDADD = $(LDADD) page_stats_DEPENDENCIES = \ $(top_builddir)/src/libstatgrab/libstatgrab.la helpers.o process_snapshot_SOURCES = process_snapshot.c process_snapshot_OBJECTS = process_snapshot.$(OBJEXT) process_snapshot_LDADD = $(LDADD) process_snapshot_DEPENDENCIES = \ $(top_builddir)/src/libstatgrab/libstatgrab.la helpers.o process_stats_SOURCES = process_stats.c process_stats_OBJECTS = process_stats.$(OBJEXT) process_stats_LDADD = $(LDADD) process_stats_DEPENDENCIES = \ $(top_builddir)/src/libstatgrab/libstatgrab.la helpers.o user_list_SOURCES = user_list.c user_list_OBJECTS = user_list.$(OBJEXT) user_list_LDADD = $(LDADD) user_list_DEPENDENCIES = \ $(top_builddir)/src/libstatgrab/libstatgrab.la helpers.o valid_filesystems_SOURCES = valid_filesystems.c valid_filesystems_OBJECTS = valid_filesystems.$(OBJEXT) valid_filesystems_LDADD = $(LDADD) valid_filesystems_DEPENDENCIES = \ $(top_builddir)/src/libstatgrab/libstatgrab.la helpers.o vm_stats_SOURCES = vm_stats.c vm_stats_OBJECTS = vm_stats.$(OBJEXT) vm_stats_LDADD = $(LDADD) vm_stats_DEPENDENCIES = \ $(top_builddir)/src/libstatgrab/libstatgrab.la helpers.o DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = cpu_usage.c disk_traffic.c filesys_snapshot.c load_stats.c \ network_iface_stats.c $(EXTRA_network_traffic_SOURCES) \ network_traffic.c os_info.c page_stats.c process_snapshot.c \ process_stats.c user_list.c valid_filesystems.c vm_stats.c DIST_SOURCES = cpu_usage.c disk_traffic.c filesys_snapshot.c \ load_stats.c network_iface_stats.c \ $(EXTRA_network_traffic_SOURCES) network_traffic.c os_info.c \ page_stats.c process_snapshot.c process_stats.c user_list.c \ valid_filesystems.c vm_stats.c am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIN_GROUP = @BIN_GROUP@ BIN_OWNER = @BIN_OWNER@ BIN_PERM = @BIN_PERM@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CLIBFLAGS = @CLIBFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOCBOOK2MAN = @DOCBOOK2MAN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ HAVE_LIBLOG4CPLUS = @HAVE_LIBLOG4CPLUS@ INC_LOG4CPLUS = @INC_LOG4CPLUS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBS_LOG4CPLUS = @LIBS_LOG4CPLUS@ LIBTOOL = @LIBTOOL@ LINKFLAGS = @LINKFLAGS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL5 = @PERL5@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SAIDARCPPFLAGS = @SAIDARCPPFLAGS@ SAIDARLIBS = @SAIDARLIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SG_EXPORT = @SG_EXPORT@ SG_IMPORT = @SG_IMPORT@ SG_PRIVATE = @SG_PRIVATE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WITH_LIBLOG4CPLUS = @WITH_LIBLOG4CPLUS@ WITH_THREADS_CONFIGURED = @WITH_THREADS_CONFIGURED@ WITH_VISIBILITY_SUPPORT = @WITH_VISIBILITY_SUPPORT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ log4cplus_CFLAGS = @log4cplus_CFLAGS@ log4cplus_LIBS = @log4cplus_LIBS@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # BUILT_HEADERS = helpers.h EXTRA_network_traffic_SOURCES = helpers.c helpers.h AM_CPPFLAGS = -I$(top_srcdir) -I$(top_builddir)\ -I$(top_srcdir)/src -I$(top_builddir)/src\ -I$(top_srcdir)/src/libstatgrab -I$(top_builddir)/src/libstatgrab \ @CLIBFLAGS@ LDADD = $(top_builddir)/src/libstatgrab/libstatgrab.la helpers.o @LINKFLAGS@ all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign examples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign examples/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list cpu_usage$(EXEEXT): $(cpu_usage_OBJECTS) $(cpu_usage_DEPENDENCIES) $(EXTRA_cpu_usage_DEPENDENCIES) @rm -f cpu_usage$(EXEEXT) $(LINK) $(cpu_usage_OBJECTS) $(cpu_usage_LDADD) $(LIBS) disk_traffic$(EXEEXT): $(disk_traffic_OBJECTS) $(disk_traffic_DEPENDENCIES) $(EXTRA_disk_traffic_DEPENDENCIES) @rm -f disk_traffic$(EXEEXT) $(LINK) $(disk_traffic_OBJECTS) $(disk_traffic_LDADD) $(LIBS) filesys_snapshot$(EXEEXT): $(filesys_snapshot_OBJECTS) $(filesys_snapshot_DEPENDENCIES) $(EXTRA_filesys_snapshot_DEPENDENCIES) @rm -f filesys_snapshot$(EXEEXT) $(LINK) $(filesys_snapshot_OBJECTS) $(filesys_snapshot_LDADD) $(LIBS) load_stats$(EXEEXT): $(load_stats_OBJECTS) $(load_stats_DEPENDENCIES) $(EXTRA_load_stats_DEPENDENCIES) @rm -f load_stats$(EXEEXT) $(LINK) $(load_stats_OBJECTS) $(load_stats_LDADD) $(LIBS) network_iface_stats$(EXEEXT): $(network_iface_stats_OBJECTS) $(network_iface_stats_DEPENDENCIES) $(EXTRA_network_iface_stats_DEPENDENCIES) @rm -f network_iface_stats$(EXEEXT) $(LINK) $(network_iface_stats_OBJECTS) $(network_iface_stats_LDADD) $(LIBS) network_traffic$(EXEEXT): $(network_traffic_OBJECTS) $(network_traffic_DEPENDENCIES) $(EXTRA_network_traffic_DEPENDENCIES) @rm -f network_traffic$(EXEEXT) $(LINK) $(network_traffic_OBJECTS) $(network_traffic_LDADD) $(LIBS) os_info$(EXEEXT): $(os_info_OBJECTS) $(os_info_DEPENDENCIES) $(EXTRA_os_info_DEPENDENCIES) @rm -f os_info$(EXEEXT) $(LINK) $(os_info_OBJECTS) $(os_info_LDADD) $(LIBS) page_stats$(EXEEXT): $(page_stats_OBJECTS) $(page_stats_DEPENDENCIES) $(EXTRA_page_stats_DEPENDENCIES) @rm -f page_stats$(EXEEXT) $(LINK) $(page_stats_OBJECTS) $(page_stats_LDADD) $(LIBS) process_snapshot$(EXEEXT): $(process_snapshot_OBJECTS) $(process_snapshot_DEPENDENCIES) $(EXTRA_process_snapshot_DEPENDENCIES) @rm -f process_snapshot$(EXEEXT) $(LINK) $(process_snapshot_OBJECTS) $(process_snapshot_LDADD) $(LIBS) process_stats$(EXEEXT): $(process_stats_OBJECTS) $(process_stats_DEPENDENCIES) $(EXTRA_process_stats_DEPENDENCIES) @rm -f process_stats$(EXEEXT) $(LINK) $(process_stats_OBJECTS) $(process_stats_LDADD) $(LIBS) user_list$(EXEEXT): $(user_list_OBJECTS) $(user_list_DEPENDENCIES) $(EXTRA_user_list_DEPENDENCIES) @rm -f user_list$(EXEEXT) $(LINK) $(user_list_OBJECTS) $(user_list_LDADD) $(LIBS) valid_filesystems$(EXEEXT): $(valid_filesystems_OBJECTS) $(valid_filesystems_DEPENDENCIES) $(EXTRA_valid_filesystems_DEPENDENCIES) @rm -f valid_filesystems$(EXEEXT) $(LINK) $(valid_filesystems_OBJECTS) $(valid_filesystems_LDADD) $(LIBS) vm_stats$(EXEEXT): $(vm_stats_OBJECTS) $(vm_stats_DEPENDENCIES) $(EXTRA_vm_stats_DEPENDENCIES) @rm -f vm_stats$(EXEEXT) $(LINK) $(vm_stats_OBJECTS) $(vm_stats_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu_usage.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disk_traffic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filesys_snapshot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/helpers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/load_stats.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/network_iface_stats.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/network_traffic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/os_info.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/page_stats.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/process_snapshot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/process_stats.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/user_list.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/valid_filesystems.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vm_stats.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: $(HEADERS) $(SOURCES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS cscopelist ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libstatgrab-0.90/examples/helpers.h000644 001750 001750 00000002276 12200025312 017337 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id$ */ #ifndef __SG_EXAMPLES_HELPERS_H__ #define __SG_EXAMPLES_HELPERS_H__ #include #include int register_sig_flagger(int signo, int *flag_ptr); int sg_warn(const char *prefix); void sg_die(const char *prefix, int exit_code); void die(int error, const char *fmt, ...); int inp_wait(int delay); #endif /* __SG_EXAMPLES_HELPERS_H__ */ libstatgrab-0.90/examples/network_traffic.c000644 001750 001750 00000013754 12200025312 021062 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id$ */ /* A very basic example of how to get the network statistics from the system * and diaply them. Also it adds up all the traffic to create and print out * a total * Takes several arguments : * -d Takes the number of seconds to wait to get traffic sent since last call * Note, this is not network traffic per second. Its the traffic since last * call. If you want it traffic per second averaged over time since last call * You need to divide against the time since last time this was called. The time * between 2 calls is stored in systime in the network_stat_t structure. * -b Display in bytes * -k Display in kilobytes * -m Display in megabytes */ #include #include #include #include #include "helpers.h" static int quit; int main(int argc, char **argv){ extern char *optarg; int c; /* We default to 1 second updates and displaying in bytes*/ int delay = 1; char units = 'b'; unsigned long long divider = 1; sg_network_io_stats *network_stats; size_t num_network_stats; /* Parse command line options */ while ((c = getopt(argc, argv, "d:bkm")) != -1){ switch (c){ case 'd': delay = atoi(optarg); break; case 'b': units = 'b'; break; case 'k': units = 'k'; divider = 1024; break; case 'm': units = 'm'; divider = 1024 * 1024; break; } } /* Initialise helper - e.g. logging, if any */ sg_log_init("libstatgrab-examples", "SGEXAMPLES_LOG_PROPERTIES", argc ? argv[0] : NULL); /* Initialise statgrab */ sg_init(1); register_sig_flagger( SIGINT, &quit ); /* Drop setuid/setgid privileges. */ if (sg_drop_privileges() != SG_ERROR_NONE) sg_die("Error. Failed to drop privileges", 1); /* We are not interested in the amount of traffic ever transmitted, just differences. * Because of this, we do nothing for the very first call. */ network_stats = sg_get_network_io_stats_diff(&num_network_stats); if (network_stats == NULL) sg_die("Error. Failed to get network stats", 1); /* Clear the screen ready for display the network stats */ printf("\033[2J"); /* Keep getting the network stats */ while ( (network_stats = sg_get_network_io_stats_diff(&num_network_stats)) != NULL){ size_t x; int line_number = 2; int ch; unsigned long long total_tx=0; unsigned long long total_rx=0; unsigned long long total_ipackets=0; unsigned long long total_opackets=0; unsigned long long total_ierrors=0; unsigned long long total_oerrors=0; unsigned long long total_collisions=0; for(x = 0; x < num_network_stats; x++){ /* Print at location 2, linenumber the interface name */ printf("\033[%d;2H%-30s : %-10s", line_number++, "Network Interface Name", network_stats->interface_name); /* Print out at the correct location the traffic in the requsted units passed at command time */ printf("\033[%d;2H%-30s : %8llu %c", line_number++, "Network Interface Rx", network_stats->rx / divider, units); printf("\033[%d;2H%-30s : %8llu %c", line_number++, "Network Interface Tx", network_stats->tx / divider, units); printf("\033[%d;2H%-30s : %llu ", line_number++, "Network Interface packets in", network_stats->ipackets); printf("\033[%d;2H%-30s : %llu ", line_number++, "Network Interface packets out", network_stats->opackets); printf("\033[%d;2H%-30s : %llu ", line_number++, "Network Interface errors in", network_stats->ierrors); printf("\033[%d;2H%-30s : %llu ", line_number++, "Network Interface errors out", network_stats->oerrors); printf("\033[%d;2H%-30s : %llu ", line_number++, "Network Interface collisions", network_stats->collisions); printf("\033[%d;2H%-30s : %ld ", line_number++, "Network Interface systime", (long) network_stats->systime); /* Add a blank line between interfaces */ line_number++; /* Add up this interface to the total so we can display a "total" network io" */ total_tx+=network_stats->tx; total_rx+=network_stats->rx; total_ipackets+=network_stats->ipackets; total_opackets+=network_stats->opackets; total_ierrors+=network_stats->ierrors; total_oerrors+=network_stats->oerrors; total_collisions+=network_stats->collisions; /* Move the pointer onto the next interface. Since this returns a static buffer, we dont need * to keep track of the orginal pointer to free later */ network_stats++; } printf("\033[%d;2H%-30s : %-10s", line_number++, "Network Interface Name", "Total Network IO"); printf("\033[%d;2H%-30s : %8llu %c", line_number++, "Network Total Rx", total_rx / divider, units); printf("\033[%d;2H%-30s : %8llu %c", line_number++, "Network Total Tx", total_tx / divider, units); printf("\033[%d;2H%-30s : %llu ", line_number++, "Network Total packets in", total_ipackets); printf("\033[%d;2H%-30s : %llu ", line_number++, "Network Total packets out", total_opackets); printf("\033[%d;2H%-30s : %llu ", line_number++, "Network Total errors in", total_ierrors); printf("\033[%d;2H%-30s : %llu ", line_number++, "Network Total errors out", total_oerrors); printf("\033[%d;2H%-30s : %llu ", line_number++, "Network Total collisions", total_collisions); fflush(stdout); ch = inp_wait(delay); if( quit || (ch == 'q') ) break; } return 0; } libstatgrab-0.90/examples/process_stats.c000644 001750 001750 00000004035 12200025312 020557 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id$ */ #include #include #include #include #include "helpers.h" static int quit; int main(int argc, char **argv){ extern char *optarg; int c; int delay = 1; sg_process_count *process_stat; while ((c = getopt(argc, argv, "d:")) != -1){ switch (c){ case 'd': delay = atoi(optarg); break; } } /* Initialise helper - e.g. logging, if any */ sg_log_init("libstatgrab-examples", "SGEXAMPLES_LOG_PROPERTIES", argc ? argv[0] : NULL); /* Initialise statgrab */ sg_init(1); /* Drop setuid/setgid privileges. */ if (sg_drop_privileges() != SG_ERROR_NONE) sg_die("Error. Failed to drop privileges", 1); register_sig_flagger( SIGINT, &quit ); if( (process_stat = sg_get_process_count()) == NULL ) sg_die("Failed to get process list", 1); while( (process_stat = sg_get_process_count()) != NULL){ int ch; printf("Running:%3llu \t", process_stat->running); printf("Sleeping:%5llu \t",process_stat->sleeping); printf("Stopped:%4llu \t", process_stat->stopped); printf("Zombie:%4llu \t", process_stat->zombie); printf("Total:%5llu\n", process_stat->total); ch = inp_wait(delay); if( quit || (ch == 'q') ) break; } exit(0); } libstatgrab-0.90/examples/disk_traffic.c000644 001750 001750 00000011117 12200025312 020312 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id$ */ /* A very basic example of how to get the disk statistics from the system * and diaply them. Also it adds up all the traffic to create and print out * a total * Takes several arguments : * -d Takes the number of seconds to wait to get traffic sent since last call * Note, this is not disk traffic per second. Its the traffic since last * call. If you want it traffic per second averaged over time since last call * You need to divide against the time since last time this was called. The time * between 2 calls is stored in systime in the disk_stat_t structure. * -b Display in bytes * -k Display in kilobytes * -m Display in megabytes */ #include #include #include #include #include "helpers.h" static int quit; int main(int argc, char **argv){ extern char *optarg; int c; /* We default to 1 second updates and displaying in bytes*/ int delay = 1; char units = 'b'; unsigned long long divider = 1; sg_disk_io_stats *diskio_stats; size_t num_diskio_stats; /* Parse command line options */ while ((c = getopt(argc, argv, "d:bkm")) != -1){ switch (c){ case 'd': delay = atoi(optarg); break; case 'b': units = 'b'; break; case 'k': units = 'k'; divider = 1024; break; case 'm': units = 'm'; divider = 1024 * 1024; break; } } /* Initialise helper - e.g. logging, if any */ sg_log_init("libstatgrab-examples", "SGEXAMPLES_LOG_PROPERTIES", argc ? argv[0] : NULL); /* Initialise statgrab */ sg_init(1); /* Drop setuid/setgid privileges. */ if (sg_drop_privileges() != 0) { perror("Error. Failed to drop privileges"); return 1; } /* We are not interested in the amount of traffic ever transmitted, just differences. * Because of this, we do nothing for the very first call. */ register_sig_flagger( SIGINT, &quit ); diskio_stats = sg_get_disk_io_stats_diff(&num_diskio_stats); if (diskio_stats == NULL) sg_die("Failed to get disk stats", 1); /* Clear the screen ready for display the disk stats */ printf("\033[2J"); /* Keep getting the disk stats */ while ( (diskio_stats = sg_get_disk_io_stats_diff(&num_diskio_stats)) != NULL) { size_t x; int line_number = 2; int ch; long long total_write=0; long long total_read=0; qsort(diskio_stats , num_diskio_stats, sizeof(diskio_stats[0]), sg_disk_io_compare_traffic); for(x = 0; x < num_diskio_stats; x++){ /* Print at location 2, linenumber the interface name */ printf("\033[%d;2H%-25s : %-10s", line_number++, "Disk Name", diskio_stats->disk_name); /* Print out at the correct location the traffic in the requsted units passed at command time */ printf("\033[%d;2H%-25s : %8llu %c", line_number++, "Disk read", diskio_stats->read_bytes / divider, units); printf("\033[%d;2H%-25s : %8llu %c", line_number++, "Disk write", diskio_stats->write_bytes / divider, units); printf("\033[%d;2H%-25s : %ld ", line_number++, "Disk systime", (long) diskio_stats->systime); /* Add a blank line between interfaces */ line_number++; /* Add up this interface to the total so we can display a "total" disk io" */ total_write+=diskio_stats->write_bytes; total_read+=diskio_stats->read_bytes; /* Move the pointer onto the next interface. Since this returns a static buffer, we dont need * to keep track of the orginal pointer to free later */ diskio_stats++; } printf("\033[%d;2H%-25s : %-10s", line_number++, "Disk Name", "Total Disk IO"); printf("\033[%d;2H%-25s : %8llu %c", line_number++, "Disk Total read", total_read / divider, units); printf("\033[%d;2H%-25s : %8llu %c", line_number++, "Disk Total write", total_write / divider, units); fflush(stdout); ch = inp_wait(delay); if( quit || (ch == 'q') ) break; } return 0; } libstatgrab-0.90/examples/filesys_snapshot.c000644 001750 001750 00000004505 12200025312 021262 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id$ */ /* A very basic example of how to get the filesystem statistics from the * system and display them. */ #include #include #include #include #include "helpers.h" int main(int argc, char **argv){ sg_fs_stats *fs_stats; size_t fs_size; /* Initialise helper - e.g. logging, if any */ sg_log_init("libstatgrab-examples", "SGEXAMPLES_LOG_PROPERTIES", argc ? argv[0] : NULL); /* Initialise statgrab */ sg_init(1); /* Drop setuid/setgid privileges. */ if (sg_drop_privileges() != 0) { perror("Error. Failed to drop privileges"); return 1; } fs_stats = sg_get_fs_stats(&fs_size); if(fs_stats == NULL) sg_die("Failed to get file systems snapshot", 1); printf( "%-16s %-24s %-8s %16s %16s %16s %7s %7s %7s %7s %9s %9s %7s %7s %7s %7s\n", "device", "mountpt", "fstype", "size", "used", "avail", "i-total", "i-used", "i-free", "i-avail", "io size", "block size", "b-total", "b-used", "b-free", "b-avail"); for( ; fs_size > 0 ; --fs_size, ++fs_stats ) { printf( "%-16s %-24s %-8s %16llu %16llu %16llu %7llu %7llu %7llu %7llu %9llu %9llu %7llu %7llu %7llu %7llu\n", fs_stats->device_name, fs_stats->mnt_point, fs_stats->fs_type, fs_stats->size, fs_stats->used, fs_stats->avail, fs_stats->total_inodes, fs_stats->used_inodes, fs_stats->free_inodes, fs_stats->avail_inodes, fs_stats->io_size, fs_stats->block_size, fs_stats->total_blocks, fs_stats->used_blocks, fs_stats->free_blocks, fs_stats->avail_blocks); } return 0; } libstatgrab-0.90/examples/process_snapshot.c000644 001750 001750 00000005211 12200025312 021255 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id$ */ #include #include #include #include #include "helpers.h" int main(int argc, char **argv){ sg_process_stats *ps; size_t ps_size; size_t x; char *state = NULL; /* Initialise helper - e.g. logging, if any */ sg_log_init("libstatgrab-examples", "SGEXAMPLES_LOG_PROPERTIES", argc ? argv[0] : NULL); /* Initialise statgrab */ sg_init(1); /* Drop setuid/setgid privileges. */ if (sg_drop_privileges() != SG_ERROR_NONE) sg_die("Error. Failed to drop privileges", 1); ps = sg_get_process_stats(&ps_size); if(ps == NULL) sg_die("Failed to get process snapshot", 1); qsort(ps, ps_size, sizeof *ps, sg_process_compare_pid); printf("%5s %5s %5s %5s %5s %5s %5s %6s %6s %9s %-10s %-4s %-8s %-6s %-6s %-20s %s\n", "pid", "ppid", "pgid", "uid", "euid", "gid", "egid", "size", "res", "time", "cpu", "nice", "state", "nvcsw", "nivcsw", "name", "title"); for(x=0;xstate) { case SG_PROCESS_STATE_RUNNING: state = "RUNNING"; break; case SG_PROCESS_STATE_SLEEPING: state = "SLEEPING"; break; case SG_PROCESS_STATE_STOPPED: state = "STOPPED"; break; case SG_PROCESS_STATE_ZOMBIE: state = "ZOMBIE"; break; case SG_PROCESS_STATE_UNKNOWN: default: state = "UNKNOWN"; break; } printf("%5u %5u %5u %5u %5u %5u %5u %5uM %5uM %8ds %10f %4d %-8s %6llu %6llu %-20s %s\n", (unsigned)ps->pid, (unsigned)ps->parent, (unsigned)ps->pgid, (unsigned)ps->uid, (unsigned)ps->euid, (unsigned)ps->gid, (unsigned)ps->egid, (unsigned)(ps->proc_size / (1024*1024)), (unsigned)(ps->proc_resident / (1024*1024)), (unsigned)ps->time_spent, (float)ps->cpu_percent, ps->nice, state, ps->voluntary_context_switches, ps->involuntary_context_switches, ps->process_name, ps->proctitle); ps++; } return 0; } libstatgrab-0.90/examples/helpers.c000644 001750 001750 00000006453 12200025312 017333 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id$ */ #include "helpers.h" #include #include #include #ifdef WITH_LIBLOG4CPLUS #include #endif #include int *sig_flags[NSIG]; static void sig_flagger(int signo) { if( sig_flags[signo] != NULL ) ++(*sig_flags[signo]); } int register_sig_flagger(int signo, int *flag_ptr) { if( ( sig_flags[signo] != NULL ) && (flag_ptr != NULL) ) return EINVAL; if(flag_ptr) { signal( signo, NULL ); sig_flags[signo] = NULL; } else { sig_flags[signo] = flag_ptr; signal( signo, sig_flagger ); } return 0; } int sg_warn(const char *prefix) { sg_error_details err_det; char *errmsg = NULL; int rc; sg_error errc; if( SG_ERROR_NONE != ( errc = sg_get_error_details(&err_det) ) ) { fprintf(stderr, "can't get error details (%d, %s)\n", errc, sg_str_error(errc)); return 0; } if( NULL == sg_strperror(&errmsg, &err_det) ) { errc = sg_get_error(); fprintf(stderr, "panic: can't prepare error message (%d, %s)\n", errc, sg_str_error(errc)); return 0; } rc = fprintf( stderr, "%s: %s\n", prefix, errmsg ); free( errmsg ); return rc; } void sg_die(const char *prefix, int exit_code) { sg_error_details err_det; char *errmsg = NULL; sg_error errc; if( SG_ERROR_NONE != ( errc = sg_get_error_details(&err_det) ) ) { fprintf(stderr, "panic: can't get error details (%d, %s)\n", errc, sg_str_error(errc)); exit(exit_code); } if( NULL == sg_strperror(&errmsg, &err_det) ) { errc = sg_get_error(); fprintf(stderr, "panic: can't prepare error message (%d, %s)\n", errc, sg_str_error(errc)); exit(exit_code); } fprintf( stderr, "%s: %s\n", prefix, errmsg ); free( errmsg ); exit(exit_code); } static void err_doit(int errnoflag, int error, const char *fmt, va_list ap) { char buf[4096]; int printed; printed = vsnprintf( buf, sizeof(buf), fmt, ap); if(errnoflag) snprintf(buf + printed, sizeof(buf) - printed, ": %s", strerror(error) ); fflush(stderr); fputs(buf, stderr); fputs("\n", stderr); fflush(NULL); } void die(int error, const char *fmt, ...) { va_list ap; va_start(ap, fmt); err_doit(1, error, fmt, ap); va_end(ap); exit(1); } int inp_wait(int delay) { struct pollfd pfd[1]; pfd[0].fd = STDIN_FILENO; pfd[0].events = POLLRDNORM; if( poll( pfd, 1, (int)(delay * 1000) ) > 0 ) { for(;;) { int ch; int len = read(STDIN_FILENO, &ch, 1); if (len == -1 && errno == EINTR) continue; if (len < 1) { perror("read"); exit(1); } return ch; } } return 0; } libstatgrab-0.90/examples/network_iface_stats.c000644 001750 001750 00000004645 12200025312 021730 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id */ #include #include #include #include #include "helpers.h" int main(int argc, char **argv){ sg_network_iface_stats *network_iface_stats; size_t iface_count, i; /* Initialise helper - e.g. logging, if any */ sg_log_init("libstatgrab-examples", "SGEXAMPLES_LOG_PROPERTIES", argc ? argv[0] : NULL); /* Initialise statgrab */ sg_init(1); /* Drop setuid/setgid privileges. */ if (sg_drop_privileges() != SG_ERROR_NONE) sg_die("Error. Failed to drop privileges", 1); network_iface_stats = sg_get_network_iface_stats(&iface_count); if(network_iface_stats == NULL) sg_die("Failed to get network interface stats", 1); if (argc != 1) { /* If an argument is given, use bsearch to find just that * interface. */ sg_network_iface_stats key; key.interface_name = argv[1]; network_iface_stats = bsearch(&key, network_iface_stats, iface_count, sizeof *network_iface_stats, sg_network_iface_compare_name); if (network_iface_stats == NULL) { fprintf(stderr, "Interface %s not found\n", argv[1]); exit(1); } iface_count = 1; } printf("Name\tSpeed\tDuplex\n"); for(i = 0; i < iface_count; i++) { printf("%s\t%llu\t", network_iface_stats->interface_name, network_iface_stats->speed); switch (network_iface_stats->duplex) { case SG_IFACE_DUPLEX_FULL: printf("full\n"); break; case SG_IFACE_DUPLEX_HALF: printf("half\n"); break; default: printf("unknown\n"); break; } network_iface_stats++; } exit(0); } libstatgrab-0.90/examples/page_stats.c000644 001750 001750 00000003630 12200025312 020015 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id$ */ #include #include #include #include #include "helpers.h" static int quit; int main(int argc, char **argv){ extern char *optarg; int c; int delay = 1; sg_page_stats *page_stats; while ((c = getopt(argc, argv, "d:")) != -1){ switch (c){ case 'd': delay = atoi(optarg); break; } } /* Initialise helper - e.g. logging, if any */ sg_log_init("libstatgrab-examples", "SGEXAMPLES_LOG_PROPERTIES", argc ? argv[0] : NULL); /* Initialise statgrab */ sg_init(1); register_sig_flagger( SIGINT, &quit ); /* Drop setuid/setgid privileges. */ if (sg_drop_privileges() != SG_ERROR_NONE) sg_die("Error. Failed to drop privileges", 1); page_stats = sg_get_page_stats_diff(NULL); if(page_stats == NULL) sg_die("Failed to get page stats", 1); while( (page_stats = sg_get_page_stats_diff(NULL)) != NULL){ int ch; printf("Pages in : %llu\n", page_stats->pages_pagein); printf("Pages out : %llu\n", page_stats->pages_pageout); ch = inp_wait(delay); if( quit || (ch == 'q') ) break; } exit(0); } libstatgrab-0.90/examples/valid_filesystems.c000644 001750 001750 00000003225 12200025312 021411 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2011-2013 i-scream * Copyright (C) 2011-2013 Jens Rehsack * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id$ */ /* A very basic example of how to get the list of valid file systems from the * system and display them. */ #include #include #include #include #include "helpers.h" int main(int argc, char **argv) { size_t nvalid_fs = 0; const char **valid_fs; /* Initialise helper - e.g. logging, if any */ sg_log_init("libstatgrab-examples", "SGEXAMPLES_LOG_PROPERTIES", argc ? argv[0] : NULL); /* Initialise statgrab */ sg_init(1); /* Drop setuid/setgid privileges. */ if (sg_drop_privileges() != 0) { sg_die("Error. Failed to drop privileges", 1); } valid_fs = sg_get_valid_filesystems(&nvalid_fs); if( valid_fs ) { size_t n = 0; printf( "Valid file systems:\n" ); for( n = 0; n < nvalid_fs; ++n ) { printf( " - %s\n", valid_fs[n] ); } } return 0; } libstatgrab-0.90/examples/cpu_usage.c000644 001750 001750 00000006770 12200025312 017646 0ustar00tdbusers000000 000000 /* * i-scream libstatgrab * http://www.i-scream.org * Copyright (C) 2000-2013 i-scream * Copyright (C) 2010-2013 Jens Rehsack * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id$ */ #include "helpers.h" #include #include #include #include #include static int quit = 0; #if 0 static void sig_int(int signo) { if( signo == SIGINT ) quit++; } #endif int main(int argc, char **argv){ extern char *optarg; int c; int delay = 1; sg_cpu_percents *cpu_percent; sg_cpu_stats *cpu_diff_stats; while ((c = getopt(argc, argv, "d:")) != -1){ switch (c){ case 'd': delay = atoi(optarg); break; } } #ifdef WIN32 delay = delay * 1000; #endif /* Initialise helper - e.g. logging, if any */ sg_log_init("libstatgrab-examples", "SGEXAMPLES_LOG_PROPERTIES", argc ? argv[0] : NULL); /* Initialise statgrab */ sg_init(1); /* XXX must be replaced by termios/(n)curses function .... if( 0 != setvbuf(stdin, NULL, _IONBF, 0) ) { perror("setvbuf"); exit(1); } */ /* Drop setuid/setgid privileges. */ if (sg_drop_privileges() != SG_ERROR_NONE) { sg_die("Error. Failed to drop privileges", 1); } register_sig_flagger( SIGINT, &quit ); /* Throw away the first reading as thats averaged over the machines uptime */ sg_snapshot(); cpu_percent = sg_get_cpu_percents(NULL); if( NULL == cpu_percent ) sg_die("Failed to get cpu stats", 1); /* Clear the screen ready for display the cpu usage */ printf("\033[2J"); while( ( ( cpu_diff_stats = sg_get_cpu_stats_diff(NULL) ) != NULL ) && ( ( cpu_percent = sg_get_cpu_percents_of(sg_last_diff_cpu_percent, NULL) ) != NULL ) ) { int ch; sg_snapshot(); printf("\033[2;2H%-14s : %lld (%6.2f)", "User CPU", cpu_diff_stats->user, cpu_percent->user); printf("\033[3;2H%-14s : %lld (%6.2f)", "Kernel CPU", cpu_diff_stats->kernel, cpu_percent->kernel); printf("\033[4;2H%-14s : %lld (%6.2f)", "IOWait CPU", cpu_diff_stats->iowait, cpu_percent->iowait); printf("\033[5;2H%-14s : %lld (%6.2f)", "Swap CPU", cpu_diff_stats->swap, cpu_percent->swap); printf("\033[6;2H%-14s : %lld (%6.2f)", "Nice CPU", cpu_diff_stats->nice, cpu_percent->nice); printf("\033[7;2H%-14s : %lld (%6.2f)", "Idle CPU", cpu_diff_stats->idle, cpu_percent->idle); printf("\033[8;2H%-14s : %llu", "Ctxts", cpu_diff_stats->context_switches); printf("\033[9;2H%-14s : %llu", " Voluntary", cpu_diff_stats->voluntary_context_switches); printf("\033[10;2H%-14s : %llu", " Involuntary", cpu_diff_stats->involuntary_context_switches); printf("\033[11;2H%-14s : %llu", "Syscalls", cpu_diff_stats->syscalls); printf("\033[12;2H%-14s : %llu", "Intrs", cpu_diff_stats->interrupts); printf("\033[13;2H%-14s : %llu", "SoftIntrs", cpu_diff_stats->soft_interrupts); fflush(stdout); ch = inp_wait(delay); if( quit || (ch == 'q') ) break; } sg_shutdown(); exit(0); }